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

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

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

MaGoth

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

Вложения

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

Vam

Почетный форумчанин
Регистрация
8 Июл 2008
Сообщения
255
Благодарности
1
Баллы
180
Есть ли подобное в VS 2010?
Ковырялся в меню - ни чего подобного не нашел:-\
Плохо искал... Давишь на файле DELETE, далее о открывшемся окне выбираешь Remove и усё.. Или через локал меню файла
 

maggi1221

Участник форума
Регистрация
7 Окт 2010
Сообщения
218
Благодарности
4
Баллы
165
Feuermagier,
перешел от соурсера к VS 2010? по какой причине? дай угадаю. он ищет строки в поиске по капсу, даже если стоит флаг "не учитывать регистр", это очень раздражает...
 

Feuermagier


Модостроитель
Регистрация
13 Апр 2008
Сообщения
934
Благодарности
136
Баллы
225
перешел от соурсера к VS 2010? по какой причине? дай угадаю. он ищет строки в поиске по капсу, даже если стоит флаг "не учитывать регистр", это очень раздражает...
Не угадал, я игру делаю не на движке готики*flowers*
Плохо искал... Давишь на файле DELETE, далее о открывшемся окне выбираешь Remove и усё.. Или через локал меню файла
У меня появляется надпись : "удалить файл безвозвратно?" подменю поле нажатия Delete не появилось
 

maggi1221

Участник форума
Регистрация
7 Окт 2010
Сообщения
218
Благодарности
4
Баллы
165
Не угадал, я игру делаю не на движке готики*flowers*

да нее) ты не понял...дело в том, что на VS 2010 можно писать любые программы/скрипты, нужно только настроить его...
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
maggi1221 написал(а):
да нее) ты не понял...дело в том, что на VS 2010 можно писать любые программы/скрипты, нужно только настроить его...
Любые программы и скрипты пишутся в простом блокноте и без настройки. :D
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
instance ItFoMutton(C_Item)
{
name = "Жареное мясо";
mainflag = ITEM_KAT_FOOD;
flags = ITEM_MULTI;
value = Value_Meat;
visual = "ItFoMutton.3DS";
material = MAT_LEATHER;
scemeName = "MEAT";
on_state[0] = Use_Meat;
description = name;
text[1] = NAME_Bonus_HP;
count[1] = HP_Meat;
text[2] = NAME_BONUS_STAPROC;
count[2] = 15;
text[5] = NAME_Value;
count[5] = Value_Meat;
};


func void Use_Meat()
{
AI_PlayAni(hero,"T_WATCHFIGHT_YEAH");
};

К скрипту жареного мяса приделан вызов анимации - работает, результат на скрине. Кстати - в этом состоянии игрок заморожен, даже в меню нельзя выйти...
Мм, я вродибы ясно выразился, "Перевести в состояние ZS_xx" зачем мне анимация? Анимация - остается анимацией в люом случае, а вот состояние это уже совсем другое пальто...

Bump:
Не угадал, я игру делаю не на движке готики*flowers*

У меня появляется надпись : "удалить файл безвозвратно?" подменю поле нажатия Delete не появилось
Хм, какаято кривая вс у тебя стоит, у меня когда даже просто delete нажимаю, вижу окно, и в нем 3 княпки "отмена" "Исключить из проекта" "Удалить"
 

maggi1221

Участник форума
Регистрация
7 Окт 2010
Сообщения
218
Благодарности
4
Баллы
165
pickpocketitem = Hlp_GetInstanceID(ItMi_EddasStatue);

отладочный вывод показывает, что pickpocketitem равна -1...
как такое может быть? или мне пора спать?
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
Чтобы получить ид инстанции, предмет/нпс/и тд, должны быть проинициализированны в мире/инвертаре нпс, тк инстнция создается в момент вызова InitByScript(и аналогичным функциями двига) а до тех пор, пока предмет не вставлен в мир, интанция равна -1
 

maggi1221

Участник форума
Регистрация
7 Окт 2010
Сообщения
218
Благодарности
4
Баллы
165
неужели нет способа сохранения объекта в переменную, и выдача его впоследствии герою (когда нужно будет)?

и еще: этот скрипт не работает на статуэтке Эдды, наверное из-за того, что статуэтки у нее нету...
Но, при первом обращении к Пабло, инфа показывает, что у него нет ключа. Второе обращение к нему показывает что ключ уже появился. Перезагружал игру несколько раз, всегда так.
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
Это готика, что тут сказать) в переменную можно сохранить только после инициализации в мире) кароче делай как в оригинале
 

maggi1221

Участник форума
Регистрация
7 Окт 2010
Сообщения
218
Благодарности
4
Баллы
165
и еще вопрос: во всех скриптах воровства в готике есть функция Npc_HasItems , наверное она надежная раз так... может ее использовать? щас попробую
 

aaa82

Участник форума
Регистрация
16 Окт 2011
Сообщения
64
Благодарности
0
Баллы
155
есть где-нибудь в скриптах реакция на нажатие рычага?
или что-нибудь про рычаги
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
444
Благодарности
264
Баллы
230
неужели нет способа сохранения объекта в переменную, и выдача его впоследствии герою (когда нужно будет)?
Обычно пользуются функцией CreateInvItem(), когда это нужно будет.
Но как вариант хранения идентефикатора предмета можно использовать примерно такой вариант:
Тут пример получения Id от инстанции:
http://forum.worldofplayers.ru/showpost.php?p=580751&postcount=1160

По крайней мере мне он показался менее ошибочным. Я использую его и по сей день.
Просто подставлять в функцию Hlp_GetInstanceID() инстанцию не очень корректно из за разницы типов. От сюда начинаются ошибки. А точнее с предметов с мульти-флагами и др. Как дальше уйдёшь в эту скриптовую систему - увидишь.

А что бы добавить, чтобы получилось то, что нужно?
Попробуй добавить вещь в инвентарь, потом получи ссылку на неё + запиши в переменную, удали вещь из инвентаря. Всё займёт доли секунд.
Причём всё это прописывать лучше в StartUp функции.
Также вещь можно вставить заранее в инвентарь, т.е. на этапе проектирования содержимого инвентаря персонажей.

Как пример, вот:
Код:
var int ItmID;//глобальная переменная.

func void Startup_OldCamp()
{
	CreateInvItem(hero,ItWr_Diary0);//создаём вещь в инвентаре ГГ
	Npc_GetInvItem(hero,ItWr_Diary0);//создаём глобальную ссылку на вещь
	ItmID = Hlp_GetInstanceID(item);//получаем нужный ID и записываем в переменную
	//Где ItWr_Diary0 - нужная нам инстанция
	Npc_RemoveInvItem(hero,ItWr_Diary0);//удаляем вещь из инвентаря ГГ
};
Обрати внимание на загружаемую локацию. У меня установлена "OldCamp.zen", от сюда и такое название "Startup_OldCamp".
Попробуй разобраться в этом.

и еще: этот скрипт не работает на статуэтке Эдды, наверное из-за того, что статуэтки у нее нету...
На сколько помню, статуэтка должна быть у ГГ. Если говорить про оригинальные скрипты.
Но, при первом обращении к Пабло, инфа показывает, что у него нет ключа. Второе обращение к нему показывает что ключ уже появился. Перезагружал игру несколько раз, всегда так.
Изучай скрипт и то, при каких условиях появляется этот ключ. Разбивай проблему на части и тестируй каждую часть, пока не поймёшь в чём дело. Это как совет.
 

maggi1221

Участник форума
Регистрация
7 Окт 2010
Сообщения
218
Благодарности
4
Баллы
165
спс за совет. кстати сегодня нашел еще 1 способ...

в папке System проги GothicSourcer есть файл RedefinedFunc.dsc, туда вписываем функцию:

int# M_instance_to_int(int#);

далее в самих скриптах делаем функцию:

func int M_instance_to_int(var int instanceItem)
{
return instanceItem;
};

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

Сохранение инстанции в переменной int:
var int pickpocketitem
pickpocketitem = M_instance_to_int ( ItKe_Valentino );
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
444
Благодарности
264
Баллы
230
maggi1221, про другой способ, который ты предлагаешь могу сказать лишь то, что при декомпиляции твоих скриптов могут возникнуть проблемы с этими статически присвоенными id.
Эти проблемы возникают в случае отсутствия информации в RedefinedFunc.dsc и RedefinedLocalVariable.dsc. Т.е. для переводчиков модов это будет не очень приятно.

Если только это рассматривать как вариант защиты данных, которые всё равно можно будет прочитать и сделать читаемыми и работоспособными.
Движёк и так полу-статический-полу-динамический! А ты хочешь увеличивать эту статическую составляющую в скриптах.
Выбор метода за тобой, я лично не советую использовать эту статику.
 

maggi1221

Участник форума
Регистрация
7 Окт 2010
Сообщения
218
Благодарности
4
Баллы
165
Jr13San,
Этот метод я узнал просматривая код функции B_GiveInvItems.
А она часто используется...
меня тогда еще заинтересовало почему в эту функцию передается instance вместо int - и при этом не возникает ошибок...
Другие методы использовать не хочу, так как придется писать оч. много однообразного кода...
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
maggi1221, Имхо, способ нормальный, это я тебе гооврю на основе того, что знаю некоторые "вкусности" двига, то что ты делаешь, аналогично на С++ выглядит так:
Код:
zCParser* par = zCParser::GetParser();
int inst = 0;
inst = par->GetIndex("Имя инстанции");
Так что страшного ничего в этом нету=)
А по поводу, всяких там переводчиков/локализаторов, ИМХО тебе должно быть всеравно, какие там у них траблы будут, главное чтобы у тебя все было ок;)

Хм, у меня есть идея, я занимаюсь расширением функционала двига готы(в основном добавление внутренних функций) и мне понадобится в скором времени тестер всего этого добра, елси желание?
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Jr13San,
Эти проблемы возникают в случае отсутствия информации в RedefinedFunc.dsc и RedefinedLocalVariable.dsc. Т.е. для переводчиков модов это будет не очень приятно.
Какие еще проблемы, это ограничение скриптового двига. И потом, кого вобщее волнуют проблемы переводчиков, или должны волновать? Если он ничего не понимает в скриптах то пусть ищет скриптолога который в этом понимает. Иначе, куда он лезет?! *???*

Движёк и так полу-статический-полу-динамический! А ты хочешь увеличивать эту статическую составляющую в скриптах.
Выбор метода за тобой, я лично не советую использовать эту статику.
Ну, с таким подходом добрую половину Готики в скриптах можно отправлять на помойку... *flowers*
 

maggi1221

Участник форума
Регистрация
7 Окт 2010
Сообщения
218
Благодарности
4
Баллы
165
Вот этот код не работает (не появляется строчка диалога)

instance DIA_Addon_GivePotion2(C_Info)
{
condition = DIA_Addon_GivePotion2_Condition;
information = DIA_Addon_GivePotion2_Info;
permanent = TRUE;
description = "Привет козел.";
};

func int DIA_Addon_GivePotion2_Condition()
{
return TRUE;
};

func void DIA_Addon_GivePotion2_Info()
{
Info_ClearChoices(DIA_Addon_GivePotion2);
Info_AddChoice(DIA_Addon_GivePotion2,Dialog_Back,DIA_Addon_GivePotion_BACK);
Info_AddChoice(DIA_Addon_GivePotion2,"...дать эликсир лечения.",DIA_Addon_GivePotion_ItPo_Health_03);
Info_AddChoice(DIA_Addon_GivePotion2,"...дать экстракт лечения.",DIA_Addon_GivePotion_ItPo_Health_02);
Info_AddChoice(DIA_Addon_GivePotion2,"...дать эссенцию лечения.",DIA_Addon_GivePotion_ItPo_Health_01);
};

func void B_Addon_GivePotion2(var C_Npc slf)
{
PrintScreen("B_Addon_GivePotion2",-1,YPOS_LevelUp,FONT_ScreenSmall,7);
DIA_Addon_GivePotion2.npc = Hlp_GetInstanceID(slf);
};

В функцию ZS_Talk () вставлена строчка

if (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(MIL_319_Pablo))
{
B_Addon_GivePotion2(self);
};

При разговоре с пабло на экран выводится текст "B_Addon_GivePotion2", что означает что код пошел по нужной нам ветке, но строчка с диалогом не появляется!

update:
даже это не работает:

instance DIA_Pablo_TEST(C_Info)
{
npc = MIL_319_Pablo;
nr = 997;
condition = DIA_Pablo_TEST_Condition;
information = DIA_Pablo_TEST_Info;
permanent = TRUE;
description = "TEST";
};

func int DIA_Pablo_TEST_Condition()
{
return TRUE;
};

func void DIA_Pablo_TEST_Info()
{
AI_StopProcessInfos(self);
};

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

Есть ли утилита для добавления в файлы сохранения переменных или диалогов? просто не хочется играть заного...
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
maggi1221, А смысл в этих утилитах?
Ведь мир игры инициализируется всего один раз при его загрузке и/или переходе на новую локацию, потом все данные читаются из сейвов, так работает двиг Готы - 1,2, к сожалению.
Хотелось бы конечно видеть все это как в том же Обливионе, вснес изменения, скомпилил, и продолжил игру, а тут пол двига переписать надо для этого... :mad:
 
Сверху Снизу