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

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

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

MaGoth

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

Вложения

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

Magmatic Imperius

Участник форума
Регистрация
21 Апр 2009
Сообщения
85
Благодарности
10
Баллы
160
Поправь скрипт B_SelectSpell.d (AI/Magic), там выбор закла прописан. В случае если у перса нет одного из указанных в данном скрипте свитка/руны, то он добавляется автоматически.
Пропиши примерно следующее (взамен того что там есть):

if((slf.guild == GIL_DMT) && (slf.aivar[AIV_MagicUser] == MAGIC_ALWAYS))
{
if(Npc_HasItems(slf,ItRu_Skull) == 0)
{
CreateInvItems(slf,ItRu_Skull,1);
};
B_ReadySpell(slf,SPL_Skull,SPL_Cost_Skull);
return TRUE;
}
else
{
return FALSE;
};
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Лучше было бы конечно, если бы ищущий издалека увидев гг атаковал черепком, но на дальнюю атаку как я понял только функция
Код:
AR_SuddenEnemyInferno
работает?
Эта функция просто сбрасывает флаг терпимости к врагу. Ессно работает только после диалога, либо агрессии.
Чтобы совсем убрать терпимость к врагу, т.е. чтобы Ищущий атаковал ГГ как только увидит издалека, убери в файлах NPC Ищущих DMT_12xx_Dementor.d строку aivar[AIV_EnemyOverride] = TRUE; или измени значение на FALSE.
 

DUSTinghoFFman

Участник форума
Регистрация
24 Май 2008
Сообщения
904
Благодарности
4
Баллы
185
Привет всем.
Назрел такой вопрос, отчасти по скриптингу, отчасти нет...

В общем:
Мне хочется сделать заклинание со следующим эффектом - ГГ кастует его, и на земле некоторое время остаётся след, задев который, НПС получат урон.
Собственно, с визуальной частью проблем нет - я изучил соответствующую документацию (о PARTICLEFX.DAT).

А вот как сделать так, чтобы магия оставляла след на земле (то есть при столкновении партикла с землей/стеной/etc. появлялся другой партикл), я пока не понял - ибо о VISUALFX.DAT документации нет. Если я не прав - дайте ссылочку пожалуйста - с удовольствием восполню пробел в знаниях. ;)

Или просто кто изучал, расскажите что знаете... Я конечно экспериментирую, но пока без толку. =(
 

Wallerstein

Участник форума
Регистрация
26 Апр 2009
Сообщения
965
Благодарности
24
Баллы
195
У меня тоже вопрос: ищущий кастует заклинания в заданном порядке: дальнобойная магия - призыв - дальнобойная магия. Но после кастования призыва он как буд - то зависает (заклинание призыва держит в руке но не кастует его) после этого должен кастовать дальнобойную магию. Как заставить его снова достать и кастовать дальнобойную магию?
 

DUSTinghoFFman

Участник форума
Регистрация
24 Май 2008
Сообщения
904
Благодарности
4
Баллы
185
У меня тоже вопрос: ищущий кастует заклинания в заданном порядке: дальнобойная магия - призыв - дальнобойная магия. Но после кастования призыва он как буд - то зависает (заклинание призыва держит в руке но не кастует его) после этого должен кастовать дальнобойную магию. Как заставить его снова достать и кастовать дальнобойную магию?

Я делал так: изменял логику соотв. заклинания вызова... например Spell_SummonSkeleton.d:

Перед строчкой if(Npc_IsPlayer(self)) дописывал
Код:
self.aivar[AIV_SelectSpell] = self.aivar[AIV_SelectSpell] + 1;

После этого странным образом все начинало работать...
Хотя, возможно, дело в том, что при призыве значение [AIV_SelectSpell] не увеличивается, а увеличивается только при попадании боевой магии в цель... не знаю, врать не буду.

Код:
func void Spell_Cast_SummonSkeleton()
{
	if(Npc_IsPlayer(self) && (PLAYERISTRANSFER == TRUE) && (PLAYERISTRANSFERDONE == FALSE))
	{
		b_transferback(self);
	};
	if(SACTANOMEPROGRESS == TRUE)
	{
		if(Npc_GetActiveSpellIsScroll(self))
		{
			self.attribute[ATR_HITPOINTS] = self.attribute[ATR_HITPOINTS] - SPL_COST_SCROLL2;
		}
		else
		{
			self.attribute[ATR_HITPOINTS] = self.attribute[ATR_HITPOINTS] - SPL_Cost_SummonSkeleton;
		};
		SACTANOMEPROGRESS = FALSE;
	}
	else if(Npc_GetActiveSpellIsScroll(self))
	{
		self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_COST_SCROLL2;
	}
	else
	{
		self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_SummonSkeleton;
	};
	self.aivar[AIV_SelectSpell] = self.aivar[AIV_SelectSpell] + 1;
	if(Npc_IsPlayer(self))
	{
		if(hero.level > Hlp_Random(35))
		{
			Wld_SpawnNpcRange(self,Summoned_Skeleton,1,500);
		}
		else
		{
			Wld_SpawnNpcRange(self,skeleton_noneexp,1,700);
		};
	}
	else
	{
		Wld_SpawnNpcRange(self,Skeleton,1,700);
	};
	if(Npc_IsPlayer(self) && (MIS_RUNEMAGICNOTWORK == LOG_Running) && (TESTRUNEME == FALSE) && !Npc_GetActiveSpellIsScroll(self))
	{
		if((FIREMAGERUNESNOT == TRUE) || (WATERMAGERUNESNOT == TRUE) || (GURUMAGERUNESNOT == TRUE) || (PALADINRUNESNOT == TRUE))
		{
			B_LogEntry(TOPIC_RUNEMAGICNOTWORK,"Как интересно! В отличие от Пирокара и других прочих магов, я могу использовать рунную магию. Что бы это значило?!");
		}
		else
		{
			B_LogEntry(TOPIC_RUNEMAGICNOTWORK,"Как интересно! В отличие от Пирокара, я могу использовать рунную магию. Что бы это значило?!");
		};
		TESTRUNEME = TRUE;
	};
	self.aivar[AIV_SelectSpell] += 1;
};
 

Wallerstein

Участник форума
Регистрация
26 Апр 2009
Сообщения
965
Благодарности
24
Баллы
195
Есть еще такой вопрос: мне надо создать триггер телепорт. Я вроде и триггер поставил, и эвент прописал, но он не работает. Пробовал и через вейпойнты, но все равно не работает.
Вот как я пробовал:
Эвент1
Код:
func void evt_teleportstation_func_new()
{

    
    if(Npc_GetDistToWP(hero,"LW_SPECIAL_WAY") < 3000)
    {
        AI_Teleport(hero,"LW_SPECIAL_WAY2");
    };
};
Эвент 2
Код:
func void evt_dialog_house()
{
    Wld_PlayEffect("spellFX_Teleport_RING",hero,hero,0,0,0,FALSE);
    Snd_Play("MFX_TELEPORT_CAST");
    Npc_ClearAIQueue(hero);
    SCUsed_TELEPORTER = TRUE;
    AI_Teleport(hero,"LW_SPECIAL_WAY");
    Snd_Play("MFX_TELEPORT_CAST");
};
Настройки триггера:
 

Вложения

  • Настройки триггера.JPG
    Настройки триггера.JPG
    47,3 KB · Просмотры: 279

DUSTinghoFFman

Участник форума
Регистрация
24 Май 2008
Сообщения
904
Благодарности
4
Баллы
185
Есть еще такой вопрос: мне надо создать триггер телепорт. Я вроде и триггер поставил, и эвент прописал, но он не работает. Пробовал и через вейпойнты, но все равно не работает.

С этим помочь не могу - ибо с триггерами не работал...

А мне-то кто-нибудь поможет? Пытался сделать по аналогии с заклинанием "огненный шторм" (оно при столкновении с объектом вспыхивает) но ничего не получилось... ПОЛНОСТЬЮ скопировал визуал - опять не вышло... *???*
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Wallerstein
Попробуй скриптовую функцию в триггере написать всеми БОЛЬШИМИ буквами.
 

zauron

Участник форума
Регистрация
26 Янв 2010
Сообщения
36
Благодарности
0
Баллы
150
Сундуки, двери и прочие КЛЮЧНЫЕ места

Уважаемые модоломатели и модокреаторы

Помогите с вопросом ключей, дверей, сундуков..
ну и прочего закрываемого и запираемого в мире Готики

очень хочется сделать пару новых предметов
1. "универсальный ключ" подходящий ко всем замкам
2. "мешочек с ключами" в который, играя, складывались бы все полученные ключи
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.860
Благодарности
6.740
Баллы
1.625
Re: Сундуки, двери и прочие КЛЮЧНЫЕ места

Уважаемые модоломатели и модокреаторы

Помогите с вопросом ключей, дверей, сундуков..
ну и прочего закрываемого и запираемого в мире Готики

очень хочется сделать пару новых предметов
1. "универсальный ключ" подходящий ко всем замкам
2. "мешочек с ключами" в который, играя, складывались бы все полученные ключи

Нереализуемо, если к двери подходят 2 ключа. Мешок с ключами - нереалезуемо вообще.


ЗЫ. и вообще товарищи. вы знаете для чего нужен тег спойлер???
ЗАЧЕМ ПРЯТАТЬ ДВЕ СТРОЧКИ В СПОЙЛЕР???????????
Это относится не только к Зорону, но и ко всем. не надо пихать кучу спойлеров в один пост.
ЗЗЫ. это только одно предназначение для тега спойлер. есть еще одно - но оно не относится к тому что я сказал.
ЗЗЗЫ. добавлен новый пункт правил в подразделе
 

s@m


Модостроитель
Регистрация
2 Мар 2007
Сообщения
315
Благодарности
56
Баллы
195
Не помогает:'(, где еще может быть ошибка?

Хорошо давай по порядку, у меня тоже такое было, вродебы все правильно сделал а вот неработает хоть ты лопни.
Я прикрепил рисунок а в спойлере прикрепил сам эвент. Называеться он так - ENTER_ADANOS_CAVE_FIRSTTIME_TRIGGER.d
его содержимое:
//****************************
//
//****************************
var int ENTER_ADANOS_CAVE_FIRSTTIME_TRIGGER_ONETIME;
func void ENTER_ADANOS_CAVE_FIRSTTIME_TRIGGER ()
{
if (ENTER_ADANOS_CAVE_FIRSTTIME_TRIGGER_ONETIME == FALSE)
{
// Start
Wld_InsertNpc (Gobbo_Green,"NW_ADANOS_CAVE_BEAST_01"); // Santi Cave
Wld_InsertNpc (Gobbo_Green,"NW_ADANOS_CAVE_BEAST_01"); // Santi Cave
ENTER_ADANOS_CAVE_FIRSTTIME_TRIGGER_ONETIME = TRUE;
};
};
Посмотри и сравни все со своим, незабывай про заглавные буквы везде, сделай точь в точь должно заработать.

Кстате у тебя там на картинке cdDyn = FALSE то есть тригер не взаимодействует с динамическимим обьектами тобишь ГГ. Поставь TRUE, и обозначь размеры тригера точней его зоны действия с помощью кнопки Edit the Box
 

Wallerstein

Участник форума
Регистрация
26 Апр 2009
Сообщения
965
Благодарности
24
Баллы
195
Ура!!! Работает!
С Эвентом всё в порядке было, действительно cdDyn = FALSE на TRUE заменил - и всё работает!*flowers* Я как обычно, всякую мелочь пропускаю...
 

DUSTinghoFFman

Участник форума
Регистрация
24 Май 2008
Сообщения
904
Благодарности
4
Баллы
185
Ура!!! Работает!
С Эвентом всё в порядке было, действительно cdDyn = FALSE на TRUE заменил - и всё работает!*flowers* Я как обычно, всякую мелочь пропускаю...
Ничего себе мелочь :D

Ну неужели мне никто не поможет?
Вопрос был выше...
 

MaGoth

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

zauron

Участник форума
Регистрация
26 Янв 2010
Сообщения
36
Благодарности
0
Баллы
150
Re: Сундуки, двери и прочие КЛЮЧНЫЕ места

Спрятал дабы не забанили за Читерские вопросы :D

Еще вопрос.. Как сделать прибавление времени +2 часа от текущего?
Или Готика 2 только строгие единицы понимает?

Если не затруднит, поподробней вопрос времени распишите..

Причина сего вопроса родилась от глупости разработчиков ("Развлечения" в Красном фонаре совершенно не отнимают времени) 8) надо поправить ;)
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Re: Сундуки, двери и прочие КЛЮЧНЫЕ места

Спрятал дабы не забанили за Читерские вопросы :D
Это ветка модостроения, а не прохождения игры. Здесь под спойлер имеет смысл прятать только длинные скрипты.

Еще вопрос.. Как сделать прибавление времени +2 часа от текущего?
Или Готика 2 только строгие единицы понимает?

Если не затруднит, поподробней вопрос времени распишите..
Код:
int Wld_IsTime (int hour1, int min1, int hour2, int min2); - возвращает 1, если текущее время находится между границами (hour1, min1 – нижняя граница, hour2, min2 – верхняя граница в часах и минутах), иначе возвращает 0.
void Wld_SetTime (int hour, int min); - установить текущее время в часах hour и минутах min.***

Пример из функции sleepabit.d, которая отвечает за сон на кровати.
t - время, которые выбираешь для пробуждения, например возьмем 8 утра.
Код:
	if(Wld_IsTime(0,0,t,0)) \\если текущее время меньше времени пробуждения, например сейчас 7 утра, а время пробуждения t = 8
	{
		Wld_SetTime(t,0); \\установить время на 8 утра и проснуться.
	}
	else \\иначе.
	{
		t = t + 24; \\прибавить к времени пробуждения 24 часа, т.е. ГГ проспит сутки + 8 часов.
		Wld_SetTime(t,0); \\Проснуться через 32 часа.
	};

Причина сего вопроса родилась от глупости разработчиков ("Развлечения" в Красном фонаре совершенно не отнимают времени) 8) надо поправить ;)
Глупо с твоей стороны клеймить разработчиков великой игры. Все предусмотреть невозможно, для этого и существуют модостроители.
 

Feuermagier


Модостроитель
Регистрация
13 Апр 2008
Сообщения
934
Благодарности
136
Баллы
225
Ура!!! Работает!
С Эвентом всё в порядке было, действительно cdDyn = FALSE на TRUE заменил - и всё работает!*flowers* Я как обычно, всякую мелочь пропускаю...

Работает, да не совсем правльно, срабатывает только один раз, хотя все настройки триггера скопированы. Может игрет роль то что в названии евента есть слова OneTime?
 

s@m


Модостроитель
Регистрация
2 Мар 2007
Сообщения
315
Благодарности
56
Баллы
195
Работает, да не совсем правльно, срабатывает только один раз, хотя все настройки триггера скопированы. Может игрет роль то что в названии евента есть слова OneTime?

//****************************
//
//****************************
var int ENTER_ADANOS_CAVE_FIRSTTIME_TRIGGER_ONETIME;
func void ENTER_ADANOS_CAVE_FIRSTTIME_TRIGGER ()
{
if (ENTER_ADANOS_CAVE_FIRSTTIME_TRIGGER_ONETIME == FALSE)
{
// Start
Wld_InsertNpc (Gobbo_Green,"NW_ADANOS_CAVE_BEAST_01"); // Santi Cave
Wld_InsertNpc (Gobbo_Green,"NW_ADANOS_CAVE_BEAST_01"); // Santi Cave
ENTER_ADANOS_CAVE_FIRSTTIME_TRIGGER_ONETIME = TRUE;
};
};
Это так делают чтобы он 1 раз срабатывал. И вроде бы где то в настройках триггера нужно ставить постоянство или нет непомню точно.
 

zauron

Участник форума
Регистрация
26 Янв 2010
Сообщения
36
Благодарности
0
Баллы
150
Re: Сундуки, двери и прочие КЛЮЧНЫЕ места

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

я не в коем случае не клеймлю Пираньев :)

Этот кусок скрипта и так видел в исходниках, только не понимаю как именно 2 часа от Текущего прибавить

где можно узнать все вейпоинты для готики 2 - ночь ворона!
некоторые советуют полетать в спейсере и посмотреть там, а нет ли другого способа?

B-MARVIN-B
F2 - toggle waynet

Прямо в игре

и видно где поинт, и удобно (сразу знаешь кого СЮДА поставить)
 
Сверху Снизу