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

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

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

MaGoth

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

Вложения

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

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
...
альтернативный способ, по сути ukur его назвал во 2-м пункте, у меня есть, но он на самый крайний случай...
А по другому этого и не сделать, ведь нужно использовать флаги боевки использования режима 2Н, для которых двиг и будет запускать анишки в зависимости от выбора режима, это если требуется чтобы Монстр использовал какой либо предмет, иначе по средством оверлеев прикручивать, и смотреть что получится. :)

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


P.S. и кстати, вопрос не совсем сюда наверное... вобщем, можно размер монстру изменить? чтоб к примеру тот же тролль в игре был раза в два меньше своего реального размера... или это только нужно саму модель изменять, а соответственно и все анимации?
Можно, используй:
Mdl_SetModelScale(self,1,1,1);

Вставля ее в в тело функции:
func void B_SetVisuals_Glm_Spider()
{
Mdl_SetVisual(self,"Glm_Spider.mds");
Mdl_SetVisualBody(self,"Glm_Spider_Body",DEFAULT,DEFAULT,"",DEFAULT,DEFAULT,-1);
Mdl_SetModelScale(self,1.05,1.05,1.05);
};

Размер модели изменяется по всем координатам, но если требуются большие изменения пропорций, то этот вариант лучше не использовать.
Тогда только изменение всей модели непосредственно в максе... ;)
 

alex_draven


Модостроитель
Регистрация
13 Сен 2007
Сообщения
2.183
Благодарности
2.880
Баллы
420
можно ли принудительно завести нпс в боевой режим, к примеру "2H", БЕЗ экипировки двуручного оружия?

Через скрипты нельзя.
при факте смерти НПС/монстра в игре, сразу удалять его из мира скриптово
скорее всего можно, только не уверен, что из инвентаря оно удалится раньше, чем монстр его уронит. Хотя скорее всего сработает.

Я бы попробовал ещё так:
- сделать невидимое оружие, пусть у твари оно экипируется как положено, но при вытаскивании забей флаг eventSwapmesh и перебрось его в левую лапу. Такое оружие не будет выпадать при смерти. А в функции обработки смерти удалять из инвентаря.
- Прописать у этого невидимого оружия функцию on_unequip, которая удаляет предмет при выпадении его же самого при гибели монстра. Возможно, так тоже сработает и не надо мудрить.
 

Жгун

Участник форума
Регистрация
30 Янв 2010
Сообщения
7
Благодарности
0
Баллы
145
MaGoth
Спасибо.

Как в г1 заспавнить итем при старте игры?
Пробовал в B_Kapitelwechsel, в проверку на первую главу написать оператор CreateInvItem(hero,ItMw_1H_Sword_Long_01);
Но всё равно не спавнится. В чём причина?
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Как в г1 заспавнить итем при старте игры?
А чем тебе не устраивает сразу НПЦ предмет прописать?

Пробовал в B_Kapitelwechsel, в проверку на первую главу написать оператор CreateInvItem(hero,ItMw_1H_Sword_Long_01);
Но всё равно не спавнится. В чём причина?
B_Kapitelwechsel срабатывает только когда меняется глава, например 1 глава наступает после разговора с Диего.
 

Жгун

Участник форума
Регистрация
30 Янв 2010
Сообщения
7
Благодарности
0
Баллы
145
Всё, кажется понял. В рюкзак ГГ можно спавнить через файл PC_Hero.d :)
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Значит смотри на название инстанции меча, который прописал в рюкзак герою и которая прописана в описании самого Итема.
Затем компиль скритпы и проверяй в игре, начиная Новую игру. :)
 

Bragi

Участник форума
Регистрация
5 Окт 2009
Сообщения
59
Благодарности
0
Баллы
155
М-м.. ты так говоришь, будто бы сам пробовал это делать, но настаивать не буду.

Пробовал *wink* (хотя есть шанс что я неправильно задавал имя для этих анимаций, пробовал по примеру других режимов - T_FistATTACKL и T_FistATTACKR)



2 MaGoth и alex_draven
Благодарю, буду пробовать. Хоть один из этих способов точно должен сработать =)
 

Жгун

Участник форума
Регистрация
30 Янв 2010
Сообщения
7
Благодарности
0
Баллы
145
Подскажите пож, как будет выглядеть проверка типа "если в нормальном фокусе id(имеется ввиду нпс) такой-то, то". Никак не могу понять, как проверить на фокус.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Читай тутор Вама..
 

Жгун

Участник форума
Регистрация
30 Янв 2010
Сообщения
7
Благодарности
0
Баллы
145
Сделал так
if (c_npc.noFocus == FALSE)
{
};

Но пишет 'Ошибка синтаксиса IF'
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Жгун
Ты всю функцию покажи, возможно ошибка до этого огрызка.
И чего у тебя за "c_npс" - это обозначение класса, а должна быть инстанция, например self.noFocus или other.noFocus.
 

Жгун

Участник форума
Регистрация
30 Янв 2010
Сообщения
7
Благодарности
0
Баллы
145
ukur
Всей функции как таковой нету.
Погоди, в языке Готики проверка обязательно должна быть в функции?

Насчёт other и self.nofocus незнал, думал только к классу можно обращатся.
Всё, кажется работает.
Осталось разобрать как ко всем НПС сразу проверку прописать...
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
C Null-ом тоже самое, только разговор нельзя пролистать.
Вообще я вместо этого и B_Say использовал, только проблемма с титрами и тут никуда не делась.
Попробуйте воспользоваться функцией AI_WaitTillEnd
 

Zteo

Участник форума
Регистрация
13 Янв 2010
Сообщения
25
Благодарности
0
Баллы
150
А просто отредактировать скрипт НПС уже созданого можно или надо после изменения компилить *???*
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
После любого редактирования скриптов, если хочешь видеть изменения в игре, нужна компиляция, иначе будешь играть в оригинал. :)
 

Друид

Участник форума
Регистрация
21 Ноя 2009
Сообщения
1.170
Благодарности
398
Баллы
285
kraw, нет, не получится. :(
 

Zteo

Участник форума
Регистрация
13 Янв 2010
Сообщения
25
Благодарности
0
Баллы
150
Так ето надо создавать новое решение и т.к. ... или как то подругом видь ето как говорится маленькая модификация на уже имеющимся скриптом*???*:D
И компилить нужно Gothic.src или тот скрпт что редактировал ??
 

Wallerstein

Участник форума
Регистрация
26 Апр 2009
Сообщения
965
Благодарности
24
Баллы
195
Надо декомпилить - компилить, по другому никак, компилить надо все решение, для работы нужны скрипты от акеллы, оригинальгные с ошибками
 

kraw


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

Может быть Вам этот прием пригодится.

Код:
void DIA_EBR_109_Syra_follow2_Info()
{
   var c_npc npcTMP;      //

   self.aivar[AIV_BABE_STAT]=1;

   npcTMP = Hlp_GetNpc(EBR_108_Velaya);
   Npc_ExchangeRoutine (npcTMP, "staywowp");
   npcTMP = Hlp_GetNpc(EBR_108_Velaya);

    AI_SetWalkMode(self,NPC_RUN);
   AI_GotoNpc(self, other);
   AI_Wait(other, 3);
    AI_SetWalkMode(npcTMP,NPC_RUN);
   AI_GotoNpc(npcTMP, other);

   AI_TurnToNPC(npcTMP,other);
   AI_TurnToNPC(self,other);
   AI_TurnToNPC(other,self);
   AI_Output(self,other,"DIA_EBR_109_Syra_follow_05"); //И где же тогда она?
   AI_Output(other,self,"DIA_EBR_109_Syra_follow_06"); //Как любит говорить один мой хороший знакомый: "Учись думать. Это тебе понравится".
   AI_Output(self,other,"DIA_EBR_109_Syra_follow_07"); //Похоже он хорошо тебя изучил, этот твой знакомый.
   AI_WaitTillEnd(npcTMP, self);
   AI_TurnToNPC(other,npcTMP);
   AI_Output(npcTMP,other,"DIA_EBR_109_Syra_follow_08"); //И сразу понял, какого умения тебе явно не хватает.
   AI_WaitTillEnd(other, npcTMP);
   AI_Output(other,self,"DIA_EBR_109_Syra_follow_09"); //Так вот - Серафии и Эйдана здесь нет.
   AI_TurnToNPC(other,self);
   AI_Output(self,other,"DIA_EBR_109_Syra_follow_10"); //Какое поразительное открытие!!!
   AI_WaitTillEnd(npcTMP, self);
   AI_TurnToNPC(other,npcTMP);
   AI_Output(npcTMP,other,"DIA_EBR_109_Syra_follow_11"); //Нам бы ни за что не догадаться!
   AI_WaitTillEnd(other, npcTMP);
   AI_Output(other,self,"DIA_EBR_109_Syra_follow_12"); //Что же могло случиться?
   AI_TurnToNPC(other,self);
   AI_Output(self,other,"DIA_EBR_109_Syra_follow_13"); //Ну так поведай нам.
   AI_Output(other,self,"DIA_EBR_109_Syra_follow_14"); //На них могли напасть. Но тогда были бы следы борьбы.
   AI_Output(self,other,"DIA_EBR_109_Syra_follow_15"); //Пожалуй...
   AI_Output(other,self,"DIA_EBR_109_Syra_follow_16"); //Напавшие могли бы увести Серафию, но Эйдан им совсем ни к чему. Его труп лежал бы здесь.
   AI_WaitTillEnd(npcTMP, other);
   AI_Output(npcTMP,other,"DIA_EBR_109_Syra_follow_17"); //Продолжай...
   AI_WaitTillEnd(other, npcTMP);
   AI_Output(other,self,"DIA_EBR_109_Syra_follow_18"); //Значит на них не нападали.
   AI_Output(self,other,"DIA_EBR_109_Syra_follow_19"); //Или напали, но им удалось скрыться.
   AI_Output(other,self,"DIA_EBR_109_Syra_follow_20"); //Ничуть не бывало. Впечатление такое, что они собирались не спеша. И оставили все в полном порядке.
   AI_Output(other,self,"DIA_EBR_109_Syra_follow_21"); //Более того, никто после этого не рылся в их вещах.
   AI_Output(self,other,"DIA_EBR_109_Syra_follow_22"); //Пожалуй, ты не безнадежен.
   AI_WaitTillEnd(npcTMP, self);
   AI_TurnToNPC(other,npcTMP);
   AI_Output(npcTMP,other,"DIA_EBR_109_Syra_follow_23"); //Голова у тебя работает. Самую малость.
   AI_WaitTillEnd(other, npcTMP);
   AI_Output(other,self,"DIA_EBR_109_Syra_follow_24"); //Куда же они могли пойти?
   AI_TurnToNPC(other,self);
   AI_Output(self,other,"DIA_EBR_109_Syra_follow_25"); //И куда же?
   AI_Output(other,self,"DIA_EBR_109_Syra_follow_26"); //Понятно, что не в Старый лагерь.
   AI_Output(self,other,"DIA_EBR_109_Syra_follow_27"); //Это уж точно.
   AI_Output(other,self,"DIA_EBR_109_Syra_follow_28"); //Да и в болотный они не направятся. Остается только Новый лагерь.
   AI_Output(self,other,"DIA_EBR_109_Syra_follow_29"); //Ну тогда в Новый лагерь!
   AI_TurnToNPC(self,npcTMP);
   AI_Wait(self, 1);
   AI_Output(self,other,"DIA_EBR_109_Syra_follow_30"); //Ты идешь?
   AI_WaitTillEnd(npcTMP, self);
   AI_TurnToNPC(npcTMP, self);
   AI_Output(npcTMP,other,"DIA_EBR_109_Syra_follow_31"); //Я, пожалуй, спешить не буду. Идите, я вас догоню.
   AI_WaitTillEnd(self, npcTMP);
   AI_Output(self,other,"DIA_EBR_109_Syra_follow_32"); //Как знаешь.
   AI_TurnToNPC(self,other);
   AI_Output(self,other,"DIA_EBR_109_Syra_follow_33"); //Вперед!

   AI_StopProcessInfos(self);
   Npc_ExchangeRoutine (self, "follow1");
   Npc_ExchangeRoutine (npcTMP, "staywowp0");
   AI_ContinueRoutine(npcTMP);
   B_LogEntry (SAVER, "Эйдана и Серафии не оказалось на месте. Будем искать их в Новом лагере.");
};
 

Feuermagier


Модостроитель
Регистрация
13 Апр 2008
Сообщения
934
Благодарности
136
Баллы
225
Приветствую! У меня вопрос: как сделать, чтобы ищущий (DMT) на гг кастовал не файербол, а черепки.
Я ему уже из инстанции весь стандартный инвентарь убрал. Экипировал только черепком, в диалоге прописал:
Код:
AI_StopProcessInfos(self);
 B_ReadySpell(self,SPL_Skull,SPL_Cost_Skull);
 B_Attack(self,other,AR_KILL,1);
и все равно он кастует именно огненный шарик:'(. Подскажите, как заставить его кастовать что то другое (смена гильдии не катит) ?

Лучше было бы конечно, если бы ищущий издалека увидев гг атаковал черепком, но на дальнюю атаку как я понял только функция
Код:
AR_SuddenEnemyInferno
работает?
 
Сверху Снизу