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

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

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

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

MaGoth

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

Вложения

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

Vam

Почетный форумчанин
Регистрация
8 Июл 2008
Сообщения
255
Благодарности
1
Баллы
180
Можно сбросить только все сразу флаги npc.flags = FALSE; включая бессмертие NPC_FLAG_IMMORTAL.
Хотя операция &= в языке отсутствует, сбросить конкретный флаг можно следующим образом: npc.flags = npc.flags & ~NPC_FLAG_IMMORTAL;
 

zauron

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

секунду внимания, возникает НЕПОСЛЕДОВАТЕЛЬНОСТЬ действий ГГ в игре(в диалоге попытка "уложить ГГ на кровать, проиграть видеофайлик, поднять с кровати и закончить диалог")

if(!C_BodyStateContains(other,BS_MOBINTERACT_INTERRUPT) && Wld_IsMobAvailable(other,"BED"))
{
AI_SetWalkMode(other,NPC_WALK);
AI_GotoWP(other,[вейпоинт у кровати]);
AI_AlignToWP(other);
AI_UseMob(other,"BED",5);
PlayVideo("[Video].BIK");
AI_UseMob(other,"BED",-1);
B_TurnToNpc(other,self);
.......................................
AI_StopProcessInfos(self);
[/Video]
[Video]
теперь опишу что делает ГГ при такой комбинации...
(запускается ролик, ГГ ложится и встает с кровати и происходит вылет из диалога... может что-то не так сделано?)[/video]
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.906
Благодарности
6.781
Баллы
1.625
Ну тут вижу два выхода:
1)
Код:
AI_SetWalkMode(other,NPC_WALK);
AI_GotoWP(other,[вейпоинт у кровати]);
AI_AlignToWP(other);
AI_UseMob(other,"BED",5);
PlayVideo("[Video].BIK");
AI_UseMob(other,"BED",-1);
B_TurnToNpc(other,self);
для этого создать доп функцию, и из диалога ее вызывать. дальше по завершению этой функции продолжается диалог. - Далжно сработать.
2)
идет диалог перед
AI_SetWalkMode(other,NPC_WALK);
дальше диалог прерывается, пишешь новый диалог - чтоб непись сам начинал сразу же после завершения первого. в нем:
Код:
AI_SetWalkMode(other,NPC_WALK);
AI_GotoWP(other,[вейпоинт у кровати]);
AI_AlignToWP(other);
AI_UseMob(other,"BED",5);
PlayVideo("[Video].BIK");
AI_UseMob(other,"BED",-1);
B_TurnToNpc(other,self);
AI_StopProcessInfos(self);
снова диалог прирывается
и начинаешь третий диалог.
тоже должно сработать*flowers*
 

zauron

Участник форума
Регистрация
26 Янв 2010
Сообщения
36
Благодарности
0
Баллы
150
MEG@VOLT, ты немного не понял(или я..) мне надо чтобы видеоролик запускался когда ГГ лежит.. вот не знаю вообще возможно ли такое *???*
Как не пытался, не получается =(
P.S. Может ктото из более опытных модокреаторов сталкивался с подобным?
(запуск ролика во время занятости ГГ MOB-функцией)


Злая рожапросто прочитай мой пост внимательно, и желательно несколько раз, я почему-то сложно это написал, но по другому не получается.


причем тут сложно - несложно написано...

я говорю совсем про другое..

Код:
AI_UseMob(other,"BED",5);
PlayVideo("[Video].BIK");
AI_UseMob(other,"BED",-1);
видео запускается перед "укладыванием" ГГ в койку.

vmazz, попробую воспользоваться твоим советом..
 

vmazz

Участник форума
Регистрация
18 Дек 2008
Сообщения
218
Благодарности
1
Баллы
165
а я бы сделал так:
Завел бы переменную, в нужный момент присвоил бы ей ТРУ.
Отправил бы ГГ на кровать, а самой кроватке уже присвоил бы MOBSI-диалог с параметром important = true; (чтоб сам вызывался). А в функцию диалога уже вставил бы PlayVideo("myvideo.bik"); MyVar = FALSE;.
Зато стопудово =)
 

zauron

Участник форума
Регистрация
26 Янв 2010
Сообщения
36
Благодарности
0
Баллы
150
Отдельный вопрос отдельным постом..
Скажите, а из средств ввода данных в игру (не считая консоли) только диалоги, или есть варианты?
Без марвина и прочих читов

Посту ниже >>
vmazz, я имел ввиду создание на основе скрипта диалога редактора переменных, но видимо нельзя,
хотя можно исхитрится нечто похожее на FaceHelper сделать
в общем бред несу (изучаю скриптологию так сказать)
 

vmazz

Участник форума
Регистрация
18 Дек 2008
Сообщения
218
Благодарности
1
Баллы
165
Кхм.. что значит ввод данных? Если ты имееш в виду вставку функций, то... хоть что! Будь то расписание/состояние/юзанье предметов/триггеры... кароче как-то так ::)
 

Bragi

Участник форума
Регистрация
5 Окт 2009
Сообщения
59
Благодарности
0
Баллы
155
Вопрос по дальности атаки. Я так понимаю она есть как и у дальнего оружия так и у ближнего? с луками и арбалетами понятно, там радиус, в котором ГГ может "зацепить" цель. А вот с оружием ближнего боя, проясните пожалуйста:

- на что влияет и что вообще означает в скрипте оружия, к примеру: range = Range_Barbarenstreitaxt;

- где можно увидеть расшифровку дальности различных оружий? тот же Range_Barbarenstreitaxt - в числовом значении, сколько это метров? или это просто длинна модели топора?

- влияет ли "range" в скрипте оружия на то, с какого расстояния нпс начнёт атаковать ГГ? (к примеру вооружить его мааахоньким ножичком у которого"дальность" будет как у двуручного топора), или она на это вообще никак не влияет?

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

З.Ы. если подробное пояснение есть где нибудь в туторах, прошу направить, не исключаю что я что то проглядел.
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
- на что влияет и что вообще означает в скрипте оружия, к примеру: range = Range_Barbarenstreitaxt;
Это радиус воздействия - собсно определяет длину клинка.

- где можно увидеть расшифровку дальности различных оружий? тот же Range_Barbarenstreitaxt - в числовом значении, сколько это метров? или это просто длинна модели топора?
Tuning_Melee_Weapons.d
const int Range_Barbarenstreitaxt = 90;
Судя, по проведенным экспериментам, изменения этого числа, цифры означают радиус до цели в сантиметрах.

- влияет ли "range" в скрипте оружия на то, с какого расстояния нпс начнёт атаковать ГГ? (к примеру вооружить его мааахоньким ножичком у которого"дальность" будет как у двуручного топора), или она на это вообще никак не влияет?
Еще как влияет, поставь например Range_Barbarenstreitaxt = 1000; и враг или НПЦ, в зависимости кто вооружен этим топором будут доставать до противника с 10 метров :))
 

Magmatic Imperius

Участник форума
Регистрация
21 Апр 2009
Сообщения
85
Благодарности
10
Баллы
160
Подскажите где лежит скрипт отвечающий за обучение ГГ навыкам до определенного уровня (например, некий непись может обучить силе до 60).
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Подскажите где лежит скрипт отвечающий за обучение ГГ навыкам до определенного уровня (например, некий непись может обучить силе до 60).
Например у Бастера, максимальный уровень обучения одноручнику в 60 единиц определяется в его диалоге DIA_SLD_802_Buster.d следующей строчкой:
Одноручный по 1 единице до 60:
B_TeachFightTalentPercent(self,other,NPC_TALENT_1H,1,60);
Одноручный по 5 единиц до 60:
B_TeachFightTalentPercent(self,other,NPC_TALENT_1H,5,60);


Торлоф DIA_SLD_801_Torlof.d
Обучает силе до 200 ед, см. ниже константы:
B_TeachAttributePoints(self,other,ATR_STRENGTH,1,T_MAX);
B_TeachAttributePoints(self,other,ATR_STRENGTH,5,T_MAX);
Обучает ловкости до 90 ед, см. ниже константы:
B_TeachAttributePoints(self,other,ATR_DEXTERITY,1,T_MED);
B_TeachAttributePoints(self,other,ATR_DEXTERITY,5,T_MED);

Константы ограничений прописаны в Story_Globals.d
const int T_MEGA = 300;
const int T_MAX = 200;
const int T_HIGH = 120;
const int T_MED = 90;
const int T_LOW = 60;
 

zauron

Участник форума
Регистрация
26 Янв 2010
Сообщения
36
Благодарности
0
Баллы
150
Уважаемые скриптологи,
А кто-нибудь додумывался сделать в диалоге какую-нибудь логическую игрушку типа крестики-нолики (у НПЦ или в Mobsi-функции на стуле или кресле)?
Допустим очень надо наступление следующего дня в игре, а еще утро.. приходится просто фигней заниматься все время (всмысле в игре), а так было бы занятие..
 

MEG@VOLT

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

zauron

Участник форума
Регистрация
26 Янв 2010
Сообщения
36
Благодарности
0
Баллы
150
Доброго времени суток, еще раз
"Ковыряясь" в текстурках и модельках ("Возвращение" + РеБаланс) заметил интересные файлики ('CHAINSAW-C.TEX' и 'ITMW_1H_CHAINSAW.MRM'), попробовал создать новый итем оружия (получилась "Бензопила") вот интересно зачем ее туда поместили, кто оказался таким веселым и каким образом ее корректно прописать?
Думаю добавить где-нить "пасхалочку"
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.906
Благодарности
6.781
Баллы
1.625
Доброго времени суток, еще раз
"Ковыряясь" в текстурках и модельках ("Возвращение" + РеБаланс) заметил интересные файлики ('CHAINSAW-C.TEX' и 'ITMW_1H_CHAINSAW.MRM'), попробовал создать новый итем оружия (получилась "Бензопила") вот интересно зачем ее туда поместили, кто оказался таким веселым и каким образом ее корректно прописать?
Думаю добавить где-нить "пасхалочку"

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

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Доброго времени суток, еще раз
"Ковыряясь" в текстурках и модельках ("Возвращение" + РеБаланс) заметил интересные файлики ('CHAINSAW-C.TEX' и 'ITMW_1H_CHAINSAW.MRM'), попробовал создать новый итем оружия (получилась "Бензопила") вот интересно зачем ее туда поместили, кто оказался таким веселым
Скорее всего бензопилу позаимствовали из немецкого мода "Жизнь пирата", видимо также для прикола, но в итоге не вставили в скрипты.

и каким образом ее корректно прописать?
Думаю добавить где-нить "пасхалочку"
Как обычный меч, вот скрипт из ЖП.

INSTANCE ItMw_Kettensaege (C_Item)
{
name = "Цепная пила";

mainflag = ITEM_KAT_NF;
flags = ITEM_SWD;
material = MAT_METAL;

value = 0;

damageTotal = 200;
damagetype = DAM_EDGE;
range = RANGE_VLKDolch;

cond_atr[2] = ATR_STRENGTH;
cond_value[2] = 150;
visual = "itmw_1h_chainsaw.3DS";

description = name;

TEXT[2] = NAME_Damage; COUNT[2] = damageTotal;
TEXT[3] = NAME_Str_needed; COUNT[3] = cond_value[2];
TEXT[5] = NAME_Value; COUNT[5] = value;

};

Кроме того в ЖП присутствовали и звуки бензопилы kettensaege.wav, но с этим уже труднее. Кроме того, что их нужно прописывать в sfx.dat, они еще и вызывались через триггер-скрипт, для чего нужно уже править ЗЕН.
Wld_SendTrigger("KETTENSAEGESOUND");
Wld_SendUnTrigger("KETTENSAEGESOUND");
 

Myxomop

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

Да и есть другие способы занятно провести время, самое быстрое - это поспать, а так охота, выполнение других квестов и т.д.
Вот это верно, крестики-нолики как то неготично :) Но вот "кости" или "очко" в кабаке, думаю в самый раз.
 

Feuermagier


Модостроитель
Регистрация
13 Апр 2008
Сообщения
934
Благодарности
136
Баллы
225
Приветствую! у меня есть вопрос: как сделать, чтобы нпс после диалога умирал?
Вствка функции убийства в конец диалога не то что нужно - нпс откидывает кони прямо во время диалога.
 

Wallerstein

Участник форума
Регистрация
26 Апр 2009
Сообщения
965
Благодарности
24
Баллы
195
Feuermagier
Код:
func int dia_нпс_condition()
{
if  (npc_knowsinfo(other,нпс_1))-диалог, после которого надо  умереть
{ 
b_killnpc(нпс); 
return  TRUE;
};

};


func void  dia_нпс_info()
{
///
};
func void dia_нпс_info() не начнется
Мог и по аське спросить ;)
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Приветствую! у меня есть вопрос: как сделать, чтобы нпс после диалога умирал?
Вствка функции убийства в конец диалога не то что нужно - нпс откидывает кони прямо во время диалога.

Пример из "Жизнь пирата"

Для начала пишешь собственную функцию распорядка с помиранием.
func void ZS_DieDelay()
{
B_ClearPerceptions(self);
B_ResetAll (self);
};

func int ZS_DieDelay_loop()
{
if (Npc_GetStateTime(self) > 3)
{
self.flags = 0;
Npc_ChangeAttribute (self, ATR_HITPOINTS, -self.attribute[ATR_HITPOINTS_MAX]);

return LOOP_END;
};

return LOOP_CONTINUE;
};

func void ZS_DieDelay_end()
{
};


Далее в файле НПЦ NONE_3020_Kerasher.d прописывается этот распорядок помирания.

FUNC VOID Rtn_RIP_3020 ()
{
TA_DieDelay (08,00,23,00,"ВЕЙПОИНТ");
TA_DieDelay (23,00,08,00,"ВЕЙПОИНТ");
};

Далее, уже в диалоге вызываешь смену распорядка
B_StartOtherRoutine(self, "RIP");
и НПЦ войдя в распорядок через некоторое время помирает.
 
Сверху Снизу