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

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

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

MaGoth

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

Вложения

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

ElderGamer


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

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
Удаляются из мира факелы.
 

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
675
Благодарности
662
Баллы
245
С WEAR_EFFECT мне помог разобраться Gratt.

Цитата:

значит по порядку.
последовательность проверки эквипа итема такова: если это фиговина с флагом
меч ->
else 2h меч ->
else шит ->
else лук ->
else арбалет ->
else WEAR_HEAD -> // подразумеваются доспехи как бы
else WEAR_TORSO ->
_________________________________________________________________________________
ни одного упоминания эффекта нету. в константном виде 16 или 1 << 4 тож ничего нет
 
Последнее редактирование:

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
ты это самое, сделай куда-нибудь список неюзабельного барахла
 

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
675
Благодарности
662
Баллы
245
А можно ли с помощью скриптов узнать какой Npc находится в фокусе?
 

ElderGamer


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

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Гм, попробовал этот способ. Работает, но есть особенности. Например, если взять в фокус непися, идентификатор "other" проинициализируется ссылкой на этого непися. Но если после этого взять в фокус объект, скамейку, например, то функция Npc_GetTarget возвратит "TRUE", а идентификатор "other" не сбросится. Нужны дополнительные проверки. Это в Г1 так, во всяком случае. :oops:
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
=>

это не совсем то. за основу этого метода берется енеми свойство oCNpc +37C/498, коим может являться не только фокус таргет.

а вот сам фокус имеет отдельную ячейку к клсссе oCNpc +9E4/9AC, где базовым его типом является zCVob из которого можно извлечь и персонажа в том числе
 
Последнее редактирование:

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
675
Благодарности
662
Баллы
245
Это правильный комментарий?
const int LOG_OBSOLETE = 4; //Миссия завершена в другом направлении (был выбор вариантов завершения)
Обычно значение слово OBSOLETE немного другое.
 
Последнее редактирование:

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
675
Благодарности
662
Баллы
245
Зачем делать функцию, которая повторяет назначение внутренней функции?

func void B_RemoveWeapon(var C_Npc slf)
{
AI_RemoveWeapon(slf);
};
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
для единообразия наименований, полагаю
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Зачем делать функцию, которая повторяет назначение внутренней функции?
Возможно, это исторический рудимент. В Г1 в подобных случаях ещё имеется вызов функции регистрации событий.
Код:
func int C_LookAtNpc(var C_Npc slf,var C_Npc oth)
{
   AI_LookAtNpc(slf,oth);
   PrintDebugNpc(PD_ZS_DETAIL,"C_LookAtNpc");
   return 1;
};
Думаю, делалось это с целью отладки движка и скриптов на стадии разработки. В Г2 эту систему выпилили, а сами скриптовые функции-дублёры остались.

Встречный вопрос. Среди внутренних функций движка есть функции работы с катсценами. Для чего вообще предназначены катсцены? Можно ли их использовать в игре, или они используются для другого, для съёмки видео, например?
 
Последнее редактирование:

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
675
Благодарности
662
Баллы
245
Я делал CutScene стандартными средствами и пытался запустить скриптами - результат нулевой. Сбой игры.

CutScene насколько я знаю в AST реализовали
 

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
675
Благодарности
662
Баллы
245
Кто-нибудь может привести пример использования функций AI_Ask(npc, func yes, func no) и AI_AskText(npc, func yes, func no, string yes, string no)
 

ElderGamer


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

ElderGamer


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

Пример:
Код:
func void Rtn_WaitFMC_3()
{
   TA_Stay(0,0,23,0,"FMC_ENTRANCE");
   TA_Stay(23,0,0,0,"FMC_ENTRANCE");
};
Код:
func void TA_Stay(var int start_h,var int start_m,var int stop_h,var int stop_m,var string waypoint)
{
   TA_Min(self,start_h,start_m,stop_h,stop_m,ZS_Stay,waypoint);
};

Почему не делают так?
Код:
func void Rtn_WaitFMC_3()
{
   TA_Min(self,0,0,23,0,ZS_Stay,"FMC_ENTRANCE");
   TA_Min(self,23,0,0,0,ZS_Stay,"FMC_ENTRANCE");
};
 
Сверху Снизу