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

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

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

MaGoth

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

Вложения

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

kraw


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

Мільтен

Участник форума
Регистрация
27 Июн 2008
Сообщения
862
Благодарности
427
Баллы
265
void Mdl_SetModelScale (c_npc self, float x, float y, float z); я в ставил в скрипт PC_HERO.d, заменил x,y,z на числа.
Но при компиляции пишет неизвестный идентификатор VOID, удаляю я этот VoId, потом выскакивает другая ошибка Ожидается ','
Что мне сделать в этой ситуации.?

Ну смотри.

void
- это тип функции. Функции такого типа не возвращают значения. При вызове тип функции указывать не надо.

Mdl_SetModelScale - название функции, писать надо.

c_npc self - этоссылка на персонажа(если по-простому). С_npc писать не нужно.
float - это тип переменной, которую можно передать функции. Число с запятой(0,1; 2,3). Его тоже писать не нужно.

Таким образом вызов функции обретает вид:

Mdl_SetModelScale (self, x, y, z);

где x, y, z - числа.
 

Sandrin

Почетный форумчанин
Регистрация
5 Авг 2009
Сообщения
8.586
Благодарности
4.047
Баллы
1.290
Доброе время суток всем!

Мне хотелось бы спросить вас об одном баге, на который наткнулась, тестируя мод "Хорана". Он не был привнесен мной, присутствовал уже в русской версии (а я переводила мод на испанский), ну вот, хотелось бы устранить его. Сразу скажу, я не моддер и не разбираюсь в этом, но понять, в принципе, могу постараться.

В общем, дело такое. Крестьянин дает ГГ задачу найти гнездо полевых хищников и доложить ему об этом, чтобы потом атаковать его вместе. Есть два варианта решения квеста: найти гнездо и убить всех хищников самому, либо найти и идти к крестьянину. Но вот баг в том, что второй способ не срабатывает. Находим гнездо, появляется надпись в дневнике, что надо идти к НПС, но когда приходим к нему, диалога не возникает!

Вот скрипт нахождения гнезда:
func int b_feldraeubernest()
{
if((Npc_IsPlayer(self) == 1) && (FRNEST_ONETIME == FALSE))
{
if(KH_FINDFR == FALSE)
{
}
else
{
B_Say(self,self,"$KH_FELDRAEUBER_GEFUNDEN_2");
B_LogEntry(TOPIC_RUEBENDIEB,"Я нашел гнездо. Теперь надо сообщить об этом Харальду.");
KH_FRNEST_ENTDECKT = TRUE;
FRNEST_ONETIME = TRUE;
};
};
return 0;
};

А вот провальный скрипт:

instance KH_5004_VLK_HARALD_BIESTERFUND(C_Info)
{
npc = kh_5004_vlk_harald;
condition = kh_5004_vlk_harald_biesterfund_condition;
information = kh_5004_vlk_harald_biesterfund_info;
important = FALSE;
permanent = TRUE;
description = "Я нашел гнездо.";
};


func int kh_5004_vlk_harald_biesterfund_condition()
{
if(Npc_KnowsInfo(hero,kh_5004_vlk_harald_habraeuber) && (MIS_RUEBENDIEB != LOG_SUCCESS) && (KH_FRNEST_ENTDECKT == TRUE) && !(Npc_IsDead(haralds_giant_bug1) || !Npc_IsDead(haralds_giant_bug2) || !Npc_IsDead(haralds_giant_bug3) || !Npc_IsDead(haralds_giant_bug4)) && (KH_HARALDLOS == FALSE))
{
return TRUE;
};
};

func void kh_5004_vlk_harald_biesterfund_info()
{
AI_Output(other,self,"KH_5004_VLK_Harald_BiesterFund_Info_15_01"); //Я нашел гнездо.
AI_Output(self,other,"KH_5004_VLK_Harald_BiesterFund_Info_07_02"); //Очень хорошо, парень. Веди меня туда.
Npc_ExchangeRoutine(self,"FOLLOW");
self.aivar[AIV_PARTYMEMBER] = TRUE;
KH_HARALDLOS = TRUE;
AI_StopProcessInfos(self);
};

Собственно, меня смущает в нем эта срока:
!(Npc_IsDead(haralds_giant_bug1) || !Npc_IsDead(haralds_giant_bug2) || !Npc_IsDead(haralds_giant_bug3) || !Npc_IsDead(haralds_giant_bug4))

Т.е. сообщения о смерти жуков. Получается, чтобы сообщить о гнезде, жуки должны быть мертвы? Но ведь то же самое условие ставится и для завершения квеста другим путем (т.е. истребление жуков самому). Вот машина и путается.
Но это мои дилетантские домыслы.

Сразу скажу, на скрипт не влияет истребление жуков до взятия квеста. Пыталась и так и этак, даже если жуков не трогать изначально - скрипт косячит.

Спасибо вам заранее, помогите, если это не сложно. *flowers* Не критичный баг, но все же... хотелось бы понять, отчего так происходит.
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Sandrin,
Поставить скобки на место:
if(Npc_KnowsInfo(hero,kh_5004_vlk_harald_habraeube r) && (MIS_RUEBENDIEB != LOG_SUCCESS) && (KH_FRNEST_ENTDECKT == TRUE) && (!Npc_IsDead(haralds_giant_bug1) || !Npc_IsDead(haralds_giant_bug2) || !Npc_IsDead(haralds_giant_bug3) || !Npc_IsDead(haralds_giant_bug4)) && (KH_HARALDLOS == FALSE))

и проверить правильность написания инстанции kh_5004_vlk_harald_habraeube r, не всегда корректно может обрабатываться Npc_KnowsInfo(hero,kh_5004_vlk_harald_habraeube r), можно попробовать заменить на переменную.
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Можно ещё попробовать заменить этот блок на улучшенный:
Код:
func int b_feldraeubernest()
{
	if((Npc_IsPlayer(self) == TRUE) && (FRNEST_ONETIME == FALSE))[COLOR="DarkGreen"]//см. const TRUE[/COLOR]
	{
		if(KH_FINDFR == TRUE)
		{
			B_Say(self,self,"$KH_FELDRAEUBER_GEFUNDEN_2");
			B_LogEntry(TOPIC_RUEBENDIEB,"Я нашел гнездо. Теперь надо сообщить об этом Харальду.");
			KH_FRNEST_ENTDECKT = TRUE;
			FRNEST_ONETIME = TRUE;
		};
	};
	return FALSE;[COLOR="DarkGreen"]//см. const FALSE[/COLOR]
};
 

Sandrin

Почетный форумчанин
Регистрация
5 Авг 2009
Сообщения
8.586
Благодарности
4.047
Баллы
1.290
Dimmell, Jr13San, огромное спасибо вам, ребята. *flowers*
Скрипт заработал как миленький, оказывается, все дело было в той злосчастной скобке...

Если что - буду к вам еще обращаться. :)
 

Мільтен

Участник форума
Регистрация
27 Июн 2008
Сообщения
862
Благодарности
427
Баллы
265
Назрело несколько вопросов.

1. Заметил, что Диего при распорядке дня Ta_Sit_Campfire сидит не так, как другие неписи. Они подпираются руками, а он скрещивает ноги по-арабски. Скажите, от чего это зависит?

2. Известный баг: при первом запуске игры все персонажи держат оружие как новички. А если вставить персонажа с помощью Wld_InsertNpc уже после начала игры, то он держит оружие как надо. Не то чтобы мне это сильно мешало, чисто из научного интереса: есть способ как-нибудь обойти это?

3.
Такая ситуация: есть две группировки, герой принадлежит к одной из них и в один момент члены этих группировок должны атаковать друг друга.

Я пишу:

Код:
Wld_SetGuildAttitude(GIL_PAL,ATT_HOSTILE,GIL_STRF);
Wld_SetGuildAttitude(GIL_STRF,ATT_HOSTILE,GIL_PAL);
Мой герой изначально каторжник. В результате паладины убивают всех каторжников кроме героя. Они просто игнорируют его. Я решил для верности еще раз присвоить герою гильдию каторжника. Написал:

Код:
hero.guild = GIL_STRF;

Npc_SetTrueGuild(hero,GIL_STRF);
Но результат тот же. Провел такой эксперимент: после начала боя переселился в другого каторжника. В результате моего прежнего героя убили а нового меня нет. То есть враги из другой гильдии напрочь отказываются убивать героя, даже если он принадлежит к враждующей гильдии.

Использую скриптовую болванку от WSA.
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Мільтен,
То есть враги из другой гильдии напрочь отказываются убивать героя, даже если он принадлежит к враждующей гильдии.
отношения гильдий к ГГ определяются ехе (а там оно нейтральное если не ошибаюсь) кроме проверок на причастие ГГ к определенной гильдии в скриптах.
Т.е. если у тебя стоит проверка в скриптах на принадлежность ГГ к конкретной гильдии, и эта проверка запускает обработчик реакции в восприятиях - тогда отработает.
100% отработает B_Attack(self,hero,AR_GuardStopsIntruder,0), или по другой причине.
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
665
Баллы
245
Назрело несколько вопросов.

1. Заметил, что Диего при распорядке дня Ta_Sit_Campfire сидит не так, как другие неписи. Они подпираются руками, а он скрещивает ноги по-арабски. Скажите, от чего это зависит?
Это зависит от наложенного оверлея анимации. Для Humans_Arrogance
// Auf Boden setzen (FP)
ani ("t_Stand_2_Sit" 1 "s_Sit" 0.1 0.0 M. "Hum_SitGround4_M01.asc" F 1 39 FPS:15)
ani ("s_Sit" 1 "s_Sit" 0.0 0.0 MI "Hum_SitGround4_M01.asc" F 40 79)
aniAlias ("t_Sit_2_Stand" 1 "" 0.0 0.2 M. "t_Stand_2_Sit" R)
2. Известный баг: при первом запуске игры все персонажи держат оружие как новички. А если вставить персонажа с помощью Wld_InsertNpc уже после начала игры, то он держит оружие как надо. Не то чтобы мне это сильно мешало, чисто из научного интереса: есть способ как-нибудь обойти это?
Странно, не замечал этого. Значит, не происходит инициализация оверлеев анимаций. Можно сразу накладывать в скрипте НПСа, как это сделано со скелетами.
 

Fazotron

Участник форума
Регистрация
8 Июл 2011
Сообщения
24
Благодарности
0
Баллы
150
изучил создание диалогов.
но вот возник вопрос - как сделать, чтобы нпс сам заговорил с гг при приближении к нему? ну как старжники у ворот старого лагеря. причем 1 раз, потом диалог не повотролся
 

kraw


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

PS: А говоришь, что изучил...
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Fazotron,

Код:
instance DIA_Xardas_Hello(C_Info)
{
	npc = NONE_100_Xardas;
	nr = 1;
	condition = DIA_Xardas_Hello_Condition;
	information = DIA_Xardas_Hello_Info;
	[B]permanent = [U]FALSE[/U][/B]; //Диалог на один раз
	[B]important = [U]TRUE[/U][/B]; //НПЦ начинает говорить сам
};
 

Fazotron

Участник форума
Регистрация
8 Июл 2011
Сообщения
24
Благодарности
0
Баллы
150
Myxomop, благодарю
Пытаюсь создать руну телепортации по вот этому уроку http://port-of-rpg.com/sozdanie-runy-teleporta/ . В спейсере создал вейпойнт NW_ISLAND_CAMP. Привязал к вейнэту. Дальше делал как написано в туторе. При компиляции пишет ошибку типа не описана функция.
Код:
AI\Magic\Spell_ProcessMana.d(320): Error: Undefined function: SPELL_LOGIC_TELEPORTISLAND

перепроверил все скрипты, все описано как в туторе.
в чем косяк?
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Fazotron,
Выложи файл скрипта Spell_Teleport_Alle.d
 

Вариматас

Забанен
Регистрация
11 Апр 2011
Сообщения
175
Благодарности
1
Баллы
165
Не, тут не в сркипте дело, нужно переместить скрипт заклинание выше скрипта AI\Magic\Spell_ProcessMana.d
 

Мільтен

Участник форума
Регистрация
27 Июн 2008
Сообщения
862
Благодарности
427
Баллы
265
Fazotron,
На port-of-rpg тоже есть форум... там тоже можно спросить. Понимаю, там сейчас пустовато, но в этом случае я не могу ничего сделать один. Если сами пользователи не будут там ничего писать, то он так и останется пустым.
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Вариматас,
Не, тут не в сркипте дело, нужно переместить скрипт заклинание выше скрипта AI\Magic\Spell_ProcessMana.d
А где он по твоему изначально лежит?
Вот вырезка из Gothic.src
Код:
AI\Magic\Spells\[B]Spell_Teleport_Alle.d[/B]
AI\Magic\Spells\Spell_Thunderstorm.d
AI\Magic\Spells\Spell_Transform.d
AI\Magic\Spells\Spell_Waterfist.d
AI\Magic\Spells\Spell_Whirlwind.d
AI\Magic\Spells\Spell_WindFist.d
AI\Magic\Spells\Spell_Zap.d
AI\Magic\[B]Spell_ProcessMana.d[/B]
AI\Magic\Spell_ProcessMana_Release.d
 
Сверху Снизу