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

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

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

MaGoth

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

Вложения

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

Ласковый Мороз

Участник форума
Регистрация
21 Апр 2010
Сообщения
91
Благодарности
3
Баллы
155
//---Monster auf dem Weg zu Farm1---
Wld_InsertNpc (Sheep, "NW_XARDAS_TOWER_04");
Wld_InsertNpc (NONE_10001_Iliad,"NW_XARDAS_TOWER_04")
вот тут- Wld_InsertNpc (YGobbo_Green, "NW_XARDAS_GOBBO_01");
Wld_InsertNpc (YGobbo_Green, "NW_XARDAS_GOBBO_02");
Wld_InsertNpc (YWolf, "NW_XARDAS_MONSTER_INSERT_01");
 

HeDeDe

Участник форума
Регистрация
17 Авг 2009
Сообщения
203
Благодарности
79
Баллы
180
//---Monster auf dem Weg zu Farm1---
Wld_InsertNpc (Sheep, "NW_XARDAS_TOWER_04");
Wld_InsertNpc (NONE_10001_Iliad,"NW_XARDAS_TOWER_04")
вот тут- Wld_InsertNpc (YGobbo_Green, "NW_XARDAS_GOBBO_01");
Wld_InsertNpc (YGobbo_Green, "NW_XARDAS_GOBBO_02");
Wld_InsertNpc (YWolf, "NW_XARDAS_MONSTER_INSERT_01");


Wld_InsertNpc (NONE_10001_Iliad,"NW_XARDAS_TOWER_04")

на конце строки пропущена точка с запятой («;»)
 

alex_draven


Модостроитель
Регистрация
13 Сен 2007
Сообщения
2.183
Благодарности
2.880
Баллы
420
:mad:
Не люблю скрипты, но была задачка, пришлось лезть не в свой огород.
Ситуация: NPC-торговец, имеет заданный инвентарь, состоящий из определённого количества предметов, прописанных в простенькой B-функции вида:

func void B_GIVE_INV()
{
CreateInvItem(self,SWORD1);
CreateInvItem(self,SWORD2);
...
CreateInvItem(self,SWORDN);
};


Вызываем функцию, торговец получает мечи. Затем, при определённом условии ему надо очистить эти мечи. Пишем так:

func void B_CLEAR_INV()
{
Npc_RemoveInvItems(self,SWORD1,Npc_HasItems(self, SWORD1);
Npc_RemoveInvItems(self,SWORD2,Npc_HasItems(self, SWORD2);
...
Npc_RemoveInvItems(self,SWORDN,Npc_HasItems(self, SWORDN);
};


При чистом тесте вроде как работает. Проверяю- инвентарь пуст. Хорошо.
Но в реальной игре можно продать ему кучу хлама, купить что-то. Короче, обычная игровая рутина. В результае у торговца может оказаться 2-3 одинаковых меча (нашёл такой-же и продал ему). Мечи не носят флаг MULTI и каждый сидит в своём слоте. В этом случае все мечи, имеющие дубликаты, остаются в инвентаре. Т.е. не срабатывает конструкция:
Npc_RemoveInvItems(self,SWORDN,Npc_HasItems(self, SWORDN);

Всё остальное удаляется: multi-предметы и оружие, не имеющее дубликатов в инвентаре торговца.
Очередной ли это глюк движка, или тут ошибка скрипта? Или быть может есть другие варианты решения задачи?
* тест вёл на Готике1. Думаю, в Г2 будет такой же результат.
 

Myxomop

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

И кроме того у тебя неправильный синтаксис, в каждой строчке не хватает скобки, компилятор по идее выдал бы ошибку:
Npc_RemoveInvItems(self,SWORD1,Npc_HasItems(self, SWORD1));
Npc_RemoveInvItems(self,SWORD1,Npc_HasItems(self, SWORD2));
...
Npc_RemoveInvItems(self,SWORDN,Npc_HasItems(self, SWORDN));
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
alex_draven, я так понимаю тебе нужно удалить определённый вид мечей из инвентаря НПС?
Создай 2 одинаковых меча в инвентаре НПС.
Проверь как работает ф-ция Npc_HasItems(). Что она возвратит тебе? Если 2, то она работает норм и проблема в ф-ции Npc_RemoveInvItems().
Скорей всего ф-ция Npc_RemoveInvItems() удаляет вещи одной инстанции из одного слота. А как же удалить все вещи одной инстанции из всех слотов?

Тебе нужно создать цикл, который бы проверял наличие мечей одной инстанции в инвентаре НПС. И если есть такая инстанция, то вызывается ф-ция Npc_RemoveInvItems() с этой инстанцией. И всё это работает до тех пор, пока инстанции не станет в инвентаре НПС. И ввести в этот цикл твоего торговца - НПС.

Ниже цикл, выводящий счётчик кажду секунду и NPC в этом цикле(как пример). Отредактируй и сделай всё, что тебе нужно для решения своей проблемы.

func void ZS_NPC()
{
self.aivar[AIV_StateTime] = 0;
};
func int ZS_NPC_Loop()
{
var int NumSec;
var int Sec;

if (Npc_GetStateTime(self) > sec)
{
NumSec = Npc_GetStateTime(self);
PrintScreen (IntToString(NumSec), -1, -1, Font_Screen, 1);
sec = sec + 1;
};

return LOOP_CONTINUE;
};
func void ZS_NPC_End()
{
PrintScreen ("Выход из функции", -1, -1, Font_Screen, 3);
};


instance EBR_9001_Gomez(Npc_Default)
{
name[0] = "Гомез";
npcType = npctype_main;
guild = GIL_PAL;
level = 100;
voice = 11;
id = 9001;
flags = NPC_FLAG_IMMORTAL;
attribute[ATR_STRENGTH] = 95;
attribute[ATR_DEXTERITY] = 80;
attribute[ATR_MANA_MAX] = 0;
attribute[ATR_MANA] = 0;
attribute[ATR_HITPOINTS_MAX] = 400;
attribute[ATR_HITPOINTS] = 400;
Mdl_SetVisual (self, "HUMANS.MDS");
Mdl_ApplyOverlayMds (self, "Humans_Arrogance.mds");
Mdl_SetVisualBody (self, "hum_body_Naked0", 0, 1, "Hum_Head_Bald", 85, 4, ITAR_Raven_Addon);
Mdl_SetModelFatness (self, 0);
Npc_SetTalentSkill (self, NPC_TALENT_2H, 2);
Npc_SetTalentSkill (self, NPC_TALENT_1H, 2);
Npc_SetTalentSkill (self, NPC_TALENT_BOW, 2);
fight_tactic = FAI_HUMAN_MASTER;
start_aistate = ZS_NPC;
};
 

alex_draven


Модостроитель
Регистрация
13 Сен 2007
Сообщения
2.183
Благодарности
2.880
Баллы
420
Функция очистки B_CLEAR_INV вызывается из диалога торговца?
Да, я для начала сделал специальную строчку в диалоге, по которой производил очистку вручную. Работает, но если нет дубликатов=(
И кроме того у тебя неправильный синтаксис..
Ну, я быстро по памяти воспроизвел. GS не даст скомпилировать проект с такой ошибкой;)
--------------------------------------->
я так понимаю тебе нужно удалить определённый вид мечей из инвентаря НПС?
Да, я планировал очищать старый хлам при переходе в новую главу. Похоже, действительно- Npc_RemoveInvItems() работает только с MULTI-предметами или одиночными. Проверил Npc_HasItems(): работает корректно и всегда возвращает правильное количество предметов, независимо от того, multi они или нет.

Пока помогло это:
Npc_RemoveInvItem(self,SWORD1);
Npc_RemoveInvItem(self,SWORD1);
Npc_RemoveInvItem(self,SWORD1);
...

итд.
Т.е. тупо пяток раз удаляем предмет одной инстанции. Повторить для каждого меча N-раз.:-\
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Зачем тебе удалять пяток раз. Тебе нужно просто ввести НПС в цикл. А в этом цикле пускай выполняется ф-ция очистки "Npc_HasItems-ое" кол-во раз(если использовать счётчик) или до тех пор, пока не будет у НПС- торговца данной инстанции. Ведь распорядки дня - это тоже циклы. Вот и создай такой цикл. И ты можешь управлять данным циклом при помощи распорядка дня. И при переходе в новую главу пускай НПС- торговец будет выполнять распорядок дня = очищать весь свой инвентарь от ненужного хлама. Ф-ция распорядка будет работать только на определённом расстоянии от ГГ.(наверное это где то предел видимости). Я бы написал тебе ф-цию полностью, но у меня нет на это время. Да и если сам напишешь, как я уже давно говорил, то у тебя будет больше радости и адреналина в крови;)
Да, и не воспринимайте всё, что вам здесь пишут как CopyRight. Просто думайте, что это лишь подсказка(так будет интереснее).
 

vmazz

Участник форума
Регистрация
18 Дек 2008
Сообщения
218
Благодарности
1
Баллы
165
Все правильно, юзай расписания.

Вот накидал примерный вид состояния:
Я не проверял, но если при возвращении LOOP_CONTINUE цикл не продолжается, а запускается заново, то:
Код:
func void ZS_ClearSwords()
{
};

func void ZS_ClearSwords_Loop()
{
	if(Npc_HasItems(self,MySword_1) > 0)
	{
		return LOOP_CONTINUE;
	};
	if(Npc_HasItems(self,MySword_2) > 0)
	{
		return LOOP_CONTINUE;
	};
	if(Npc_HasItems(self,MySword_3) > 0)
	{
		return LOOP_CONTINUE;
	};
	...
	return LOOP_END;
};

func void ZS_ClearSwords_End()
{
};

если же все-таки продолжает бежать по строчкам, то:
Код:
func void ZS_ClearSwords()
{
};

func void ZS_ClearSwords_Loop()
{
	var int Swords;
	Swords = Npc_HasItems(self,MySword_1);
	Swords = Swords + Npc_HasItems(self,MySword_2);
	Swords = Swords + Npc_HasItems(self,MySword_3);
	...
	
	Npc_RemoveInvItem(self,MySword_1);
	Npc_RemoveInvItem(self,MySword_2);
	Npc_RemoveInvItem(self,MySword_3);
	...
	
	if(Swords == 0)
	{
		return LOOP_END;
	};

	return LOOP_CONTINUE;
};

func void ZS_ClearSwords_End()
{
};
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Интересно, а что будет, если вот такой расклад:
MySword_1 = 5 шт.
MySword_2 = 7шт.
MySword_3 = 1 шт.

Что произойдёт с Npc_RemoveInvItem(self,MySword_3); на 2-ом входе в цикл?
т.е. MySword_3 = 0 шт. И произойдёт удаление чего? или просто проигнорилуется движком, или удалится первая попавшаяся инстанция, или баги какие появятся, или что?
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Какие-то расписания, циклы...
Если меч в игре не уникальный, и он может присутствовать в не единичном количестве - ставишь флаг MULTI и все складируется в 1 слот и очищается одной функцией. И без слома мозгов.

Посту ниже:
А что мешает поставить флаг? Национальная гордость? :D
Меч-то не единичный в игре, и что неадекватное может вызвать этот флаг?
PS. И поаккуратней на поворотах.
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Dimmell,
Читай начальные посты... Мне кажатся ты поленился прочитать пару страниц назад.
Мечи не носят флаг MULTI и каждый сидит в своём слоте.

Какие-то расписания, циклы...
Если меч в игре не уникальный, и он может присутствовать в не единичном количестве - ставишь флаг MULTI и все складируется в 1 слот и очищается одной функцией. И без слома мозгов.
Не занимайся самодеятельностью пожалуйста! А если у тебя ломаются мозги от одного цикла, то как ты вообще пишешь скриптовые функции?

Для поста выше:
Согласен с укуром.
Если бы alex_draven'y нужно было бы сделать так, как ты написал, то он бы давно так и сделал.
Да, кстати можно не обязательно вводить в цикл NPC. Так как таймеры в Готике существуют, то можно создать 1 и запустить его по необходимости с нужной ф-цией, а потом сделать так, чтобы он автоматически выкючился(т.е. больше не циклил с триггером). А если надо вызвать, то пускай опять циклит. Но для этого нужно писать вспомогательные ф-ции...
 

Myxomop

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

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
ukur,
Это что, такая фишка Готики1? Во 2-й Готе вроде все нормально - 1 меч в руку, остальные в инвентаре, и не падают на землю (это у ГГ), а если у торговца - не все ли равно сколько мечей будет выпадать при его поражении? Они все равно останутся лежать или он встанет, и поднимет всю пачку, или останется на трупе, или пропадет вместе с трупом (если и остались на нем)
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Dimmell,
То что ты описал якобы только для ГГ, работает для всех БЕЗ флага МУЛЬТИ. Автоскладывание оружия в кучки с выделением из оной экипированного оружия появилось ТОЛЬКО начиная с Г2 - Ночь Ворона и причем на уровне движка, а НЕ скриптов. Ты же предлагал присвоить скриптовому предмету флаг МУЛЬТИ, о последствиях которого я уже тебе во всех подробностях ответил. Так что перед тем как дважды что-либо оспорить, хотя бы проверь для начала чужие слова.
 

vmazz

Участник форума
Регистрация
18 Дек 2008
Сообщения
218
Благодарности
1
Баллы
165
Интересно, а что будет, если вот такой расклад:
MySword_1 = 5 шт.
MySword_2 = 7шт.
MySword_3 = 1 шт.

Что произойдёт с Npc_RemoveInvItem(self,MySword_3); на 2-ом входе в цикл?
т.е. MySword_3 = 0 шт. И произойдёт удаление чего? или просто проигнорилуется движком, или удалится первая попавшаяся инстанция, или баги какие появятся, или что?

Если итема нет, то ничего и не случится. Проигнорируется.

ЗЫ: Кстати, а чем не вариант:
Npc_RemoveInvItems(self,MySword_1,9999);
Npc_RemoveInvItems(self,MySword_2,9999);
Npc_RemoveInvItems(self,MySword_3,9999);
::)
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Не знаю что такое с ГГ, но произошла странная вещь...

Пишу в _Intern/Constains
const int GIL_TEST = 70;
тут жа заменяю
const int GIL_MAX = 67;

Заменяю у PC_Hero
guild = GIL_TEST;

Затем в игре пытаюсь достать оружие и происходит глюк с анимацией. WTF???
Какое отношение гильдия имеет к анимации? или если у ГГ странная гильдия, то пускай глюкнет?Мне смешно. Вот в таком положении ГГ и замирает, спасает только марвин:
GIL_TEST_GLUK.jpg

Посту ниже:
Мда, ну и тупость разработчиков - пол игры динамически меняется, а половина зашита и скрыта от посторонних глаз...
Поставил объявление новой гильдии выше GIL_MAX. Оружие достаёт нормально, но при выходе из игры вылетает ошибка связанная со значениями в памяти, короче одни сплошные баги и глюки. Попробую ещё поколдовать над этим делом. Но как я понимаю, изменить отношения с новой гильдией я всё равно не смогу, потому что таблица гильдий не должна изменяться в размерах?
 

Myxomop

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

MaGoth

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

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Jr13San,
Новые Гильдии тоже добавить возможно. Это пустые слоты в массиве Гильдий, а вот сверх них уже добавить не получится.

Т.е. этим всем ты хочешь сказать, что я могу только заменить уже существующую(ии) гильдию(ии), но не добавить вниз этой таблицы ещё строку и столбец, т.к. таблица 16x16 = 256 и нарушать это дело нельзя?
 

MaGoth

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

Зы, а заменять ты их можешь хоть все... :)
 
Сверху Снизу