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

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

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

MaGoth

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

Вложения

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

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
665
Баллы
245
Dimmell, возможно последним куском скрипта, ссылка self опять перекидывается на hero (self=ГГ)
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
redleha,
возможно последним куском скрипта, ссылка self опять перекидывается на hero (self=ГГ)
хз, просто уже не один раз сталкивался с косяками в последовательности и корректности отработки функций. Особенно в диалогах. Например, говорим с Лестером, заканчивая разговор должна проиграться визуалка телепорта и он должен телепортнуться к Ксару сменив попутно распорядок. Так вот, в этом списке очень важно не нарушить последовательность вызова функций, иначе или визуала не будет и он просто исчезнет, или он вообще пойдет забив на телепорт, или зависнет на экране диалога после исчезновения Лестера, или еще чего. :D
вот такая последовательность корректно отрабатывается:
{
Wld_PlayEffect("SPELLFX_TELEPORT",self,self,0,0,0,FALSE);
AI_StopProcessInfos(self);
Npc_ExchangeRoutine(PC_Psionic,"XardasTow");
AI_Teleport(PC_Psionic,"NW_XARDAS_TOWER_LESTER");
self.aivar[AIV_INVINCIBLE] = FALSE;
other.aivar[AIV_INVINCIBLE] = FALSE;
все другие - с косяками.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Dimmell,
хз, просто уже не один раз сталкивался с косяками в последовательности и корректности отработки функций. Особенно в диалогах. Например, говорим с Лестером, заканчивая разговор должна проиграться визуалка телепорта и он должен телепортнуться к Ксару сменив попутно распорядок. Так вот, в этом списке очень важно не нарушить последовательность вызова функций, иначе или визуала не будет и он просто исчезнет, или он вообще пойдет забив на телепорт, или зависнет на экране диалога после исчезновения Лестера, или еще чего.
вот такая последовательность корректно отрабатывается:
Из диалогов функцию телепорта вызывать нельзя (!) будут большие глюки. Это насколько я помню, телепорт надо в расписание вставлять, дальше после окончания диалога.
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
MaGoth,
Вызывается и без проблем и дальнейших глюков. Проверено годами игры в Возвращение, Ребалансы и СнК. :D
Какой бениной мамы расписание?
Вот более полный кусок из диалога:
Код:
instance DIA_Lester_BACKINTOWN(C_Info)
{
	npc = PC_Psionic;
	nr = 2;
	condition = DIA_Lester_BACKINTOWN_Condition;
	information = DIA_Lester_BACKINTOWN_Info;
	important = TRUE;
};


func int DIA_Lester_BACKINTOWN_Condition()
{
	if((Npc_GetDistToWP(self,"LEVELCHANGE") <= 500) && (Kapitel == 3))
	{
		return TRUE;
	};
};

func void DIA_Lester_BACKINTOWN_Info()
{
	AI_Output(self,other,"DIA_Lester_BACKINTOWN_13_00");	//Эй, ты вернулся, наконец! Ты должен немедленно увидеться с Ксардасом. Возникли проблемы.
	AI_Output(other,self,"DIA_Lester_BACKINTOWN_15_01");	//В это я готов поверить.
	AI_Output(self,other,"DIA_Lester_BACKINTOWN_13_02");	//После того, как ты ушел, здесь начался ад кромешный.
	AI_Output(self,other,"DIA_Lester_BACKINTOWN_13_03");	//Поговори с Ксардасом, он ждет тебя!
	AI_Output(self,other,"DIA_Lester_BACKINTOWN_13_04");	//Передал мне эту руну для тебя. Она поможет тебе добраться до него побыстрее. Увидимся там.
	AI_Output(self,other,"DIA_Lester_BACKINTOWN_13_05");	//Я тоже телепортируюсь. На дорогах слишком опасно.
	CreateInvItems(self,ItRu_TeleportXardas,1);
	B_GiveInvItems(self,other,ItRu_TeleportXardas,1);
	Info_ClearChoices(DIA_Lester_BACKINTOWN);
	Info_AddChoice(DIA_Lester_BACKINTOWN,"...(Закончить разговор)",DIA_Lester_BACKINTOWN_end);
};

func void DIA_Lester_BACKINTOWN_end()
{
	Wld_PlayEffect("SPELLFX_TELEPORT",self,self,0,0,0,FALSE);
	AI_StopProcessInfos(self);
	Npc_ExchangeRoutine(PC_Psionic,"XardasTow");
	AI_Teleport(PC_Psionic,"NW_XARDAS_TOWER_LESTER");
	self.aivar[AIV_INVINCIBLE] = FALSE;
	other.aivar[AIV_INVINCIBLE] = FALSE;
};
Где расписание?
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.168
Баллы
915
В процессе работы над новыми расписаниями для NPC я столкнулся с непонятными моментами:
1. Иногда NPC почему-то не останавливаются на заданной им точке, а уходят на конечную точку сети путей, например, в таверне Снафа в бандитском лагере многие уходят на точку BL_INN_03_C.
2. Не всегда срабатывает писание (TA_Pee): я попробовал заставить Патрика перед отдыхом отлить у дерева, которое регулярно удобряет Буллко (NW_BIGFARM_TREE), но в отличие от него Патрик просто встаёт на эту точку без анимации писания. Зато два безимянных бандита у костра перед подъёмом в верхнюю часть лагеря регулярно отмечаются на точке BL_UP_PEE.
3. Не получается заставить Мильтена в Хоринисе ночью потренироваться с магией (TA_Practice_Magic) - он переходит на точку NW_MONASTERY_ENTRY_01, но вместо отработки анимаций каста заклов тупо стоит на месте.
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
665
Баллы
245
Dimus, во многих расписаниях, НПС, дабы освободить сетку путей, уходят на фрипойнты. Также, они могут не выполнять действия, если не находятся на этом фри.
+ ещё - .....нпс могут тупить, если у них сетка путей по времени пересекается с другим НПС, а вариантов пройти по другому пути нет.
 

GothMass


Модостроитель
Регистрация
4 Окт 2010
Сообщения
336
Благодарности
314
Баллы
220
Каким образом можно сделать к оружию эффект "удара тролля" (поясняю: что бы нпс улетал на несколько метров) И можно ли расстояние полета увеличить?
 

hell9999

Участник форума
Регистрация
12 Апр 2008
Сообщения
2.049
Благодарности
1.169
Баллы
340
Это не удар тролля, если ты не знал. Посмотри на скрипты каменного голема и все поймешь.
 

Bjorn++

Участник форума
Регистрация
28 Июн 2011
Сообщения
1.063
Благодарности
46
Баллы
235
У меня такой вопрос:
Как сделать условие при котором строчка диалога появится через определенное время?
Приведу пример... ГГ подходит к паладину и просит у него например 20 монет, паладин говорит приходи через 4 часа и при истечении этого времени появляется строчка диалога у паладина типа "Дай мне золота", а если время ещё не истекло то этой строчки просто нет.
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Можно попробовать через оверлей. Но оверлей довольно капризная штука. Например, мне не удалось его заставить устойчиво работать, если он применяется в диалоге к самому же диалоговому NPC. Т. е. если я (ГГ, конечно) ведет диалог с неким персонажем (пусть, например, с Диего), то к Диего оверлей применять нельзя. Можно только к третьему персонажу.
 

Bjorn++

Участник форума
Регистрация
28 Июн 2011
Сообщения
1.063
Благодарности
46
Баллы
235
Нет, с оверлеем дело иметь не хочу:D
kraw вот смотри пример условия:
http://forum.worldofplayers.ru/member.php?u=8202
{
if((Kapitel == 1) && Npc_KnowsInfo(other,DIA_****_****) && ( вот здесь нужно прописать еще одно условие, т.е наше время через которое появится строчка диалога ))
{
return TRUE;
};
};


Kapitel == 1 - 1 глава. это условие что этот диалог появится в 1 главе.
Npc_KnowsInfo(other,DIA_****_****) - Это условие отвечает за то что строчка диалога появится после определенного диалога.
И рядом с этими двумя условиями нужно, как я понял, вписать еще одно условие которое будет отвечать за время через которое появится диалог. Т.е мне нужно узнать что там нужно прописать...?
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
665
Баллы
245
Толик95, а что мешает сделать функцию получения текущего времени? В Саге есть несколько моментов, связанных на ожидание пары-тройки часов. Да, хотя бы та же добыча руды.
 

Bjorn++

Участник форума
Регистрация
28 Июн 2011
Сообщения
1.063
Благодарности
46
Баллы
235
У меня Темной Саги нету, я его не качал, весит уж для моего интернета много, не потяну... Пожалуйста, если ты знаешь что нужно прописать, то напиши *flowers* буду благодарен.
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Толик95,
грызем тутор VAMa до дыр ...
int Wld_GetDay (); - получить текущий день, отсчет дней идет от дня старта (Gamestart) = 0.
int Wld_IsTime (int hour1, int min1, int hour2, int min2); - возвращает 1, если текущее время находится между границами (hour1, min1 – нижняя граница, hour2, min2 – верхняя граница в часах и минутах), иначе возвращает 0.
А дальше включаем в работу предназначенный для дум инструмент.
Вариантов реализации - море. Можно тупо проверками через Wld_IsTime, можно вообще через циклический триггер.
 

Bjorn++

Участник форума
Регистрация
28 Июн 2011
Сообщения
1.063
Благодарности
46
Баллы
235
Dimmell то есть у нас должно получится вот так (смотр.спойлер).
{
if((Kapitel == 1) && Npc_KnowsInfo(other,DIA_****_****) && int Wld_IsTime (int hour1, int min1, int hour2, int min2))
{
return TRUE;
};
};
Можно тупо проверками через Wld_IsTime
Это как?
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Толик95,
Dimmell то есть у нас должно получится вот так (смотр.спойлер).
*facepalm*
Так у вас нихрена не получится.
Открываем проект даже оригинальной Г2а забиваем в поиск Wld_IsTime и видим:

attachment.php

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

Вложения

  • sshot-32.jpg
    sshot-32.jpg
    238,5 KB · Просмотры: 492

zinador

Участник форума
Регистрация
9 Июн 2009
Сообщения
9
Благодарности
0
Баллы
145
[Готика 1]Вставка НПС в Игру

Привет всем,у меня проблемы с вставкой NPC в игру.
Что я хочу я хочу чтобы в готике 1 рядом со стартовой позицией GG стоял npc.
И еще Когда декомпилю dat файл,нечего не трогаю и обратно компилирую,у меня GothicSourcer не компилирует выдает сообщение о 65 ошибках и прерывает процесс компиляции,как быть подскажите пожалуйста,здесь на сайте видел статью о том как вставить NPC в готику 2 ,но у меня тут Готика 1 .
 

Bjorn++

Участник форума
Регистрация
28 Июн 2011
Сообщения
1.063
Благодарности
46
Баллы
235
Re: [Готика 1]Вставка НПС в Игру

Ошибки? Значит просто их нужно исправлять. Если конечно нету альтернативного выхода из этой ситуации... Хотя можно вежливо попросить исправленные скрипты у модостроителей имеющие дело с Г1. т.е разрабы модов для Г1... ну ты понял я думаю...
 

MaGoth

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

Что до вопросов то:
1. смотришь на имя вейпоинта стартовой точки, и прописываешь в скриптах вставку по этому вею своего Нпс.
2. Ошибки компиляции/декомпиляции нужно править тебе самому, если нет чистой скриптовой болванки, за тебя это делать никто не станет.
3. Между Г1 и Г2 в скриптах, особой разницы нет, только в некоторых функциях.
 
Сверху Снизу