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

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

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

MaGoth

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

Вложения

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

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.167
Баллы
915
Смотри уроки скриптологии, часть 1, тема 6: Функции
int Npc_HasItems (c_npc n0, int itemInstance); - возвращает количество предметов itemInstance у НПС n0.
Если хочешь, чтобы появилось сообщение о передаче предметов, используй функцию:
int B_GiveInvItems (C_Npc giver, C_Npc taker, int itemInstance, int amount); - передать указанное кол-во amount предметов itemInstance из инвентаря НПС giver в инвентарь НПС taker.
А если надо скрытно передать предметы, то функции:
void Npc_RemoveInvItems (c_npc owner, int itemInstance, int amount); - указанное кол-во amount предметов itemInstance удаляется из инвентаря НПС owner и из игры;
void CreateInvItems (c_npc n0, int n1, int n2); - создает в инвентаре НПС n0 предметы с ID n1 количеством n2.
 

Вложения

  • Vam_tutor.chm
    174,7 KB · Просмотры: 65
Последнее редактирование:

Vlad_Torop

Участник форума
Регистрация
2 Май 2014
Сообщения
870
Благодарности
499
Баллы
230
У НПЦ в инвентаре есть X предметов, после диалога они подменяются таким же количеством чего-то другого.
Сложность в том, что X может быть любым числом...

И как заставить НПС отдать, допустим, все стрелы, если заранее не известно, сколько их у него?
var int VseStreli;//Вводишь переменную
VseStreli = Npc_HasItems(self,ItRw_Arrow);//присваиваешь ей значение кол-ва предметов у НПС
далее,делаешь с этой переменной все что хочешь:
Npc_RemoveInvItems(self,ItRw_Arrow,VseStreli);//удаляешь из инвенторя НПС
CreateInvItems(self,ItRw_Bolt,VseStreli);//либо заменяешь другими предметами
B_GiveInvItems(self,other,ItRw_Arrow,VseStreli);//либо передаешь от НПС к ГГ
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185
Салют народ. Готика 2. Такой вопрос, есть ли у нас функция, которая удалит конкретный предмет(один) из зена ?
Wld_RemoveItem() у меня что-то не работает, сколько я не тестил, ни разу мне единичку не присылал) Буду благодарен, за конкретный, а главное - рабочий пример этой функции, если кто использовал.

Или может на АСТе есть ? Я посмотрел там список функций, но вроде там нет такой, хотя раньше вроде список был побольше.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.231
Баллы
525
Я не использовал. В скриптах Г1 можно найти упоминание функции, но используется она сомнительным образом в тестовых скриптах:
Код:
instance Lester_Bugfixbook(C_Item)
{
   name = "Schicke Lester nach Hause";
   mainflag = ITEM_KAT_DOCS;
   flags = ITEM_MISSION;
   value = 100;
   visual = "ItWr_Book_02_05.3ds";
   material = MAT_LEATHER;
   scemeName = "MAP";
   on_state[0] = UseLester_Bugfixbook;
};


func void UseLester_Bugfixbook()
{
   var int nDocID;
   var C_Npc bugfix_lester;
   nDocID = Doc_Create();
   Doc_SetPages(nDocID,2);
   Doc_SetPage(nDocID,0,"Book_Mage_L.tga",0);
   Doc_SetPage(nDocID,1,"Book_Mage_R.tga",0);
   Doc_SetFont(nDocID,-1,"font_10_book.tga");
   Doc_SetMargins(nDocID,0,275,20,30,20,1);
   Doc_PrintLine(nDocID,0,"Zwinge Baal Lukor");
   Doc_PrintLine(nDocID,0,"in den Followmode");
   Doc_PrintLines(nDocID,0,"");
   Doc_PrintLine(nDocID,0,"");
   Doc_PrintLines(nDocID,0,"");
   Doc_PrintLine(nDocID,0,"");
   Doc_SetMargins(nDocID,-1,30,20,275,20,1);
   Doc_PrintLine(nDocID,1,"");
   Doc_PrintLine(nDocID,1,"");
   Doc_PrintLines(nDocID,1,"");
   Doc_PrintLine(nDocID,1,"");
   Doc_PrintLines(nDocID,1,"");
   Doc_Show(nDocID);
   bugfix_lester = Hlp_GetNpc(PC_Psionic);
   Npc_ExchangeRoutine(bugfix_lester,"start");
   Npc_RemoveInvItem(hero,Lester_Bugfixbook);
   Wld_RemoveItem(Lester_Bugfixbook);
};

Если функция Wld_RemoveItem и работает, то основная сложность заключается в получении ссылки на предмет класса C_ITEM. Эту ссылку можно получить только в особых случаях. Например, ссылку класса C_ITEM возвращают восприятия PERC_ASSESSQUIETSOUND (упавший на землю предмет) и PERC_ASSESSTHEFT (поднятый предмет). Также есть функции, позволяющие получить ссылку на экипированное оружие и доспехи (Npc_GetEquippedMeleeWeapon, Npc_GetEquippedRangedWeapon, Npc_GetEquippedArmor, Npc_GetReadiedWeapon). Или можно получить ссылку на предмет в инвентаре непися с помощью функции Npc_GetInvItem.
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185
Я не использовал. В скриптах Г1 можно найти упоминание функции, но используется она сомнительным образом в тестовых скриптах:
Попробовал напрямую удалять, инстансами, как в примере. Все равно ноль шлет)
Даже зациклил на 1000 итераций, вдруг оно в рандомном месте так удаляет, все равно ни разу единицы не было.
Попробую еще с уникальной вещью, которая в единственном экземпляре есть... но это мне как-бы мало поможет.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.300
Благодарности
4.633
Баллы
625
не удалишь ты инстами. функции необходимо передать непосредственно указатель на предмет. по какому признаку движок должен понять какой объект необходимо удалить?
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185
не удалишь ты инстами. функции необходимо передать непосредственно указатель на предмет. по какому признаку движок должен понять какой объект необходимо удалить?
Я пробовал через ищущий огонек удалять, там используется обертка item. Это очень похоже на непосредственный указатель на предмет, но в любом случае, удалять ничего не хочет. Правда я так и не нашел, где она инициализируется, так бы можно было от этого плясать. С этой обертки можно легко получить имя предмета и его прочие характеристики. Можно id получить... но это не то.

Вроде без расширителей нельзя получить ссылку на предмет в фокусе ? Я не скриптил уже давно, так что не совсем помню)
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.300
Благодарности
4.633
Баллы
625
я не могу ответить на твой вопрос, пока ты не ответишь на мой. если в мире будет 2 копии одного предмета, как он должен выбирать между ними?
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185
я не могу ответить на твой вопрос, пока ты не ответишь на мой. если в мире будет 2 копии одного предмета, как он должен выбирать между ними?
Откуда я знаю, я код функции не вижу.) Сидеть догадываться можно долго, а конкретного понятия - ссылка, тут вообще помоему нет.
Но вообще, по идее, у каждого предмета должен быть свой id, или хеш, или иной идентификатор. Или координаты в конце концов... да много чего можно придумать, другое дело, что доступа к этому у нас нет.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.300
Благодарности
4.633
Баллы
625
доступ есть ко всему. ТЗ распиши как следует.. какой предмет, зачем его удалять и тд и тп
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185
ТЗ распиши как следует.. какой предмет, зачем его удалять и тд и тп
Да ничего сложного, нпц(не обязательно человек) видит item, item удаляется. А идея вообще, сделать из огонька нечто вроде носильщика, видит вещь - подходит, поднимает, идет к следующей.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.231
Баллы
525
Но вообще, по идее, у каждого предмета должен быть свой id, или хеш, или иной идентификатор.
Про то и разговор. Инстанция - она одна на всех, а каждый представитель этой инстанции в игровом мире может иметь свою ссылку класса C_Item.

Я пробовал через ищущий огонек удалять, там используется обертка item.
Наспех посмотрел скрипты Г2. Кажется, там используется у огонька восприятие PERC_ASSESSITEM. Но вот где оно активируется, я не уловил. :oops:

нпц(не обязательно человек) видит item, item удаляется.
Пропиши у огонька анимацию-пустышку поднятия предмета в MDS-скрипте и используй функцию AI_TakeItem в распорядке огонька.
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185
Пропиши у огонька анимацию-пустышку поднятия предмета в MDS-скрипте и используй функцию AI_TakeItem в распорядке огонька.
Я подумывал о чем-то таком. Просто не совсем уверен, лезть ли туда, где ничего не понимаю. Попробую конечно, спасибо.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.300
Благодарности
4.633
Баллы
625
Просто не совсем уверен, лезть ли туда, где ничего не понимаю.
придется. это единственный вариант нормальной реализации без косяков и экстендеров.
потом AI_TakeItem прописываешь в B_GetWispDetectedItem вместо Wld_PlayEffect и все.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.231
Баллы
525
Кажется, там используется у огонька восприятие PERC_ASSESSITEM.
Нет, не использует. Тогда я не понимаю, как он ищет предметы.

используй функцию AI_TakeItem
Гм, и здесь могут быть проблемы. Дело в том, что огонёк находится в режиме кулачного боя. И в его MDS-скрипте не прописано анимаций обычного передвижения, не в боевом режиме. А в боевом режиме функция AI_TakeItem может и не сработать. :oops:
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185
Пропиши у огонька анимацию-пустышку поднятия предмета в MDS-скрипте и используй функцию AI_TakeItem в распорядке огонька.
Хм, а что хоть примерно делать то ?) Я заглянул в хуманс, нашел такой фрагмент.
Код:
// ---------------------------------------------------------------------------------------------------------------
// Item AUFHEBEN
            ani            ("c_Stand_2_IGet_1"        1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    1    9)
            ani            ("c_Stand_2_IGet_2"        1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    21    29)
            ani            ("c_Stand_2_IGet_3"        1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    41    49)
            aniComb        ("t_Stand_2_IGet"        1    "s_IGet"        0.1    0.0    M.    "c_Stand_2_IGet_"            3)

            ani            ("c_IGet_1"                1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    10    10)
            ani            ("c_IGet_2"                1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    30    30)
            ani            ("c_IGet_3"                1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    50    50)
            aniComb        ("s_IGet"                1    "s_IGet"        0.0    0.0    M.    "c_IGet_"                    3)

            ani            ("c_IGet_2_Stand_1"        1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    11    19)
            ani            ("c_IGet_2_Stand_2"        1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    31    39)
            ani            ("c_IGet_2_Stand_3"        1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    51    59)
            aniComb        ("t_IGet_2_Stand"        1    ""                0.0    0.1    M.    "c_IGet_2_Stand_"            3)

Переименовал hum на irrlight, затестил - нифига. Потом создал Irrlight_ItemGet_A03.asc, опять нифига. Ладно, поискал на компе, нашел HumanS-c_Stand_2_IGet_1.man и прочие, наделал таких для Irrlight - те что прописаны в mds, но опять нифига. Прямо ощущаю трату времени, лезу туда, где ничего не понимаю.)

А в боевом режиме функция AI_TakeItem может и не сработать.
А может не работает как раз из-за этого.)
 

Myxomop

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

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.231
Баллы
525
А может не работает как раз из-за этого.)
Это можно проверить на человеке, если заставить его сначала вытащить оружие, а потом поднять предмет.

Я заглянул в хуманс, нашел такой фрагмент.
Поскольку анимация поднятия не нужна, можно прописать только копии существующих анимаций с помощью инструмента aniAlias.
 
Сверху Снизу